从下午大概3点半到现在0:24分,就围着这些代码敲和看了,有部分不明白,例如content是个什么玩意.不过照着敲了,到现在代码运行起来不报错,可是程序也一直不给反应,不知道为什么,记录一下,免得遗失后够敲了,要敲很久.
import re
import requests
import json
import time
from requests.exceptions import RequestException
def get_one_page(url):
try:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}
response = requests.get(url,headers=headers)
print(response.status_code)
if response.status_code == 200:
return response.text
return None
except RequestException:
return None
def parse_one_page(html):
pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star>*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>',re.S)
items = re.findall(pattern,html)
print(items)
for item in items:
yield{
'index':item[0],
'image':item[1],
'title':item[2],
'actor':item[3].strip()[3:], #if len(item[3]) > 3 else '',
'time':item[4].strip()[5:], #if len(item[4]) >5 else '',
'score':item[5] + item[6]
}
def write_to_file(content):
with open('result.txt','a',encoding='utf-8') as f:
print(type(json.dumps(Conntent)))
f.write(json.dumps(content,ensure_ascii=False)+'\n')
def main(offset):
url = 'http://maoyan.com/board/4?offset=' + str(offset)
html = get_one_page(url)
for item in parse_one_page(html):
print(item)
write_to_file(item)
if __name__ == '__main__':
for i in range(10):
main(offset=i * 10)
time.sleep(1)
20分钟后问题已找出,原因:正则表达式错误
替换为
pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
+ '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
+ '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',re.S)
还有一个问题,猫眼电影当你访问的时候第一次是需要验证的,然后我是直接用chrome打开滑动的验证,否则程序访问也不对,但是最近一次是很久都没有去手动划了,不知道为什么程序依然可以爬.我程序设置的User-Agent就是我自己chrome的User-Agent
2020年3月23日凌晨1点15分更新以下内容
草,有的时候你会发现一个空格的缩进,一个TAB的缩进,或者函数末尾没有加冒号,或者你没加单引号,总之很多或者,就会出问题.
我的意思是,其实我的疑惑是这样的一个问题,但是却隔了那么久我才发现,原来是这样的.
我有去鱼C求助的,结果刚发完帖子,被告知审核中,然后自己研究解决了,下边是发帖的求助内容:
content是什么?它是什么参数?上下文中都没有,在哪里继承或者说是传递过来的>? 程序为什么会被执行,程序是至上而下执行的,可是这个 write_to_file函数没有被调用啊
还有一个是最下面的 什么是if name == 'main':
双下划线代表什么?为什么要这样写,直接写main()可不可以?
其实name和main这个问题我百度已经解决了,按照这个程序直接写main(),应该也是可以的.应该是吧,我也不知道,以后慢慢解决.因为main下边好像还有内容,改成main()的话下边的内容我就不知道怎么搞进来了.
然后是第一个问题 content,在main(offset)函数的最后一行,它是有被调用过的,是我自己没看到.
在接下来是2020年3月23日修改的代码,我看那个if name=='main':下面的逻辑实在是不舒服,于是我就不用它了,我直接改到了main()函数里面,经过测试还是可以的,我还特意删除了time.sleep的等待时间,依然可以.
然后其实我发现还是写在if name=='main'里面,看着比较简洁.囧....
不过至少表明自己把这个实例和之前不用if name 的实例都看懂且能操作了
import re
import requests
import json
import time
from requests.exceptions import RequestException
def get_one_page(url):
try:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}
response = requests.get(url,headers=headers)
print(response.status_code)
if response.status_code == 200:
return response.text
return None
except RequestException:
return None
def parse_one_page(html):
pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
+ '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
+ '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',re.S)
items = re.findall(pattern,html)
print(items)
for item in items:
yield{
'index':item[0],
'image':item[1],
'title':item[2],
'actor':item[3].strip()[3:], #if len(item[3]) > 3 else '',
'time':item[4].strip()[5:], #if len(item[4]) >5 else '',
'score':item[5] + item[6]
}
def write_to_file(content):
with open('xiugai.txt','a',encoding='utf-8') as f:
#print(type(json.dumps(Conntent)))
f.write(json.dumps(content,ensure_ascii=False)+'\n')
f.close()
def main():
urls = ['http://maoyan.com/board/4?offset=']
for i in range(10):
urls.append(f'http://maoyan.com/board/4?offset={i * 10}')
# time.sleep(1)
print(urls)
for url in urls:
html = get_one_page(url)
for item in parse_one_page(html):
print(item)
write_to_file(item)
# if __name__ == '__main__':
main()
# for i in range(10):
# main(offset=i * 10)
# time.sleep(1)