目前使用Request+正则表达式,爬取猫眼电影top100的例子很多,就不再具体阐述过程!
完整代码github:https://github.com/connordb/Top-100
总结一下,容易出错的问题有:
1.没有加请求头,导致输出没有具体信息!
headers={
"User-Agent": "Mozilla / 5.0(Windows NT 6.1) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 67..3396.99 Safari / 537.36"
}
2.正则出问题:
这个没有好的办法,只能写一点,然后打印输出,看看是否正确输出,常见的问题:另起一行要有+号;另起一行的时候头尾要有引号;
具体要抓取的内容要用();
pattern=re.compile('<dd>.*?board-index.*?>(d+)</i>.*?title="(.*?)".*?star">(.*?)</p>.*?setime">(.*?)</p>'
+'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',re.S)
3.写入文件出现问题:
在写入文件的时候,当你输入f.write(content)会报错,报错内容显示只能写入字符串格式,而不是字典格式,此时解决办法是写入
f.write(json.dumps(conten))
当你成功输出数据时,发现没有换行,此时加入换行符
f.write(json.dumps(conten)+'/n')
当你成功输出数据时,发现汉字没有显示出来,此时需要把with open('maoyan.txt','a')改为
with open('maoyan.txt','a',encoding='utf-8'),
f.write(json.dumps(conten))改为f.write(json.dumps(conten,ensure_ascii=False))
数据输出保存成功!
接下来我们比较一下加多进程的好处:
#!/usr/bin/python # -*- coding:<utf-8> -*- import requests import time from requests.exceptions import RequestException import re import json def get_one_page(url): try: headers={ "User-Agent": "Mozilla / 5.0(Windows NT 6.1) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 67..3396.99 Safari / 537.36" } response=requests.get(url,headers=headers) 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>.*?title="(.*?)".*?star">(.*?)</p>.*?setime">(.*?)</p>' +'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',re.S) items=re.findall(pattern,html) #print(items) for item in items: yield{ 'index':item[0], 'name':item[1], 'actor':item[2].strip()[3:], 'date':item[3].strip()[5:], 'grade':item[4]+item[5] } def write_to_file(content): with open('maoyan1.txt','a',encoding='utf-8') as f: f.write(json.dumps(content,ensure_ascii=False)+' ') f.close def main(offset): url='http://maoyan.com/board/4?offset='+str(offset) html=get_one_page(url) parse_one_page(html) for item in parse_one_page(html): print(item) write_to_file(item) #print(html) if __name__ == '__main__': start=time.time() for i in range(10): main(i*10) end=time.time() print('运行时间:',end-start)
输出结果为:运行时间: 1.7671008110046387
当加入多进程以后:
#!/usr/bin/python # -*- coding:<utf-8> -*- import requests import time from requests.exceptions import RequestException import re import json from multiprocessing import Pool def get_one_page(url): try: headers={ "User-Agent": "Mozilla / 5.0(Windows NT 6.1) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 67..3396.99 Safari / 537.36" } response=requests.get(url,headers=headers) 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>.*?title="(.*?)".*?star">(.*?)</p>.*?setime">(.*?)</p>' +'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',re.S) items=re.findall(pattern,html) #print(items) for item in items: yield{ 'index':item[0], 'name':item[1], 'actor':item[2].strip()[3:], 'date':item[3].strip()[5:], 'grade':item[4]+item[5] } def write_to_file(content): with open('maoyan1.txt','a',encoding='utf-8') as f: f.write(json.dumps(content,ensure_ascii=False)+' ') f.close def main(offset): url='http://maoyan.com/board/4?offset='+str(offset) html=get_one_page(url) parse_one_page(html) for item in parse_one_page(html): print(item) write_to_file(item) #print(html) if __name__ == '__main__': start=time.time() # for i in range(10): # main(i*10) pool=Pool() pool.map(main,[i*10 for i in range(10)]) end=time.time() print('运行时间:',end-start) #main()
此时输出结果:运行时间: 1.0980627536773682
所以:
不加多进程运行时间: 1.7671008110046387,加多进程运行时间:1.0980627536773682
因此加了进程池以后,大大提高了代码运行速度!