利用Requests+正则表达式爬取猫眼电影
声明:
网上有太多资源学习python,找来找去,有各种技术博客各种技术站点各种公众号,眼花缭乱,摸索很长时间,才发现,大部分时间浪费在“百度一下”,信息检索与浏览实在不该浪费我如此多的精力,因此,决定剑走偏锋,跟着某乎来学,可能会比较杂乱,重点会是python爬虫,数据处理方面,当然最终目标是掌握python,入门机器学习,AI。该系列笔记会优先贴出某乎答主的链接!
本篇“玩python”来源答主链接:
利用Requests+正则表达式爬取猫眼电影,学习全过程记录与体会。
环境配置:
1.系统环境:Ubuntu 14.04 LTS
2.编译环境:Python3.4.3
3.依赖库: requests re json multiprocessing
流程图
具体demo:
如下所示,具体注释请参考答主链接!
#!/bin/python3
import requests
from multiprocessing import Pool
from requests.exceptions import RequestException
import re
import json
def get_one_page(url):
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.108 Safari/537.36 2345Explorer/8.7.0.16013'
}
try:
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>.*?data-src="(.*?)".*?</a>.*?name"><a.*?>(.*?)</a>'
+'.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
+'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',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:],
'time':item[4].strip()[5:],
'score':item[5]+item[6],
}
def write_to_file(content):
with open('result.txt','a',encoding='utf-8') as f:
f.write(json.dumps(content,ensure_ascii=False)+'\n')
def main(offset):
url = 'http://maoyan.com/board'
html = get_one_page(url)
for item in parse_one_page(html):
write_to_file(item)
if __name__=='__main__':
pool = Pool()
pool.map(main,[i*10 for i in range(10)])
效果:
result.txt是新生成的纯文本文档,存储爬取的主要信息。
回顾
- 单纯的码代码不过是搬运工,最低级的Ctrl+c Ctrl+v。
- 网页请求使用requests的get方法,设置header,try except 块的使用可以防止程序中断。
- 网页解析主要采用re模块,正则表达式处理str获取想要关键信息。
- yield——生成器,荐读:Python yield 使用浅析
- 字典转json以便存储。
- 进程池Pool效果不明显,初次使用,可能数据量过小。
思考
re模块过于复杂,可以尝试使用bs解析html。导出的文档排版很不清晰,不便于查看与使用,可以试试生成新的html文件,或者excel表格。