多进程,Request+正则表达式爬取榜单类网站
来源:互联网 发布:python刷题原理 编辑:程序博客网 时间:2024/05/01 12:20
本文是利用多进程、requests库和正则表达式,爬取猫眼电影的TOP100的榜单。
1:requests库的安装及详细用法
关于requests库的具体安装方法,详见博客:http://blog.csdn.net/qq_29186489/article/details/78581249;request库的介绍以及用法,请参见博客:http://blog.csdn.net/qq_29186489/article/details/78620663;
2:正则表达式的详细用法
正则表达式的详细用法请参见博客:http://blog.csdn.net/qq_29186489/article/details/78635640
3:爬取猫眼电影
1)爬虫思路分析
本次爬取的对象是猫眼电影的TOP100的榜单。
先打开猫眼电影的TOP100的榜单的页面,如下图所示:
我们的目的是爬取TOP100电影榜单的100部电影的排序、电影名称、电影的主演、上映的时间、分数等信息,打印输出并保存至本地。
2)网页结构分析
观察网页,本次爬取任务大致可以分为三个步骤
爬取单个电影的电影的序号、电影名称、电影的主演、上映的时间等
分析整个网页,遍历获取该页面上所有电影的信息
实现翻页,遍历每个页面获取该榜单所有的100个电影的信息;观察URL,翻页可通过改变offset实现,http://maoyan.com/board/4?offset=(页数-1)*10
利用chrome浏览器,审查网页源代码,每部电影的整体信息都被dd标签包围,如下所示:
我们需要抓取的信息都包含在dd标签中,遍历dd标签,用正则表达式匹配提取我们需要的信息,就可以把信息提取出来,并保存至本地
4:具体实现
1)引入相关类库,requests库用于网页请求,requestexception用于异常处理,Poolli利用多线程并行进行抓取操作,re正则表达式用于解析字符串并获取所需内容,json用于对json数据的处理,fake_useragent用于模拟浏览器伪装请求头。
# -*- coding: utf-8 -*-import requestsfrom requests.exceptions import RequestExceptionfrom multiprocessing import Poolimport reimport jsonfrom fake_useragent import UserAgent
2)利用requests请求获取单个网页HTML,请求猫眼电影时,需模拟浏览器的headers信息,否则会被网站拒绝访问。
具体的代码实现如下所示:
def get_one_page(url): #生成请求头信息 headers={"User-Agent":UserAgent().random} try: #请求网站信息 response=requests.get(url,headers=headers) #判断返回状态码是否是200 if response.status_code==200: #正确请求后,返回网页HTML信息 return response.text else: #未正确请求,返回为空 return None #捕获异常,出现异常,返回为空 except RequestException: return None
3)利用正则表达式,解析单个网页,获取序号、电影名称、主演、上映时间,并构建字典,以生成器的形式返回,具体的代码实现如下:
#解析单个网页def parse_one_page(html): #编写正则表达式,获取序号、电影名称、主演、上映时间 pattern=re.compile('<dd>.*?board-index.*?">(.*?)</i>.*?title="(.*?)".*?"star">(.*?)</p>.*?"releasetime">(.*?)</p>.*?</dd>',re.S) results=re.findall(pattern,html) #构建字典,返回生成器 for result in results: yield { "序号":result[0].strip(), "电影名字":result[1].strip(), "演员":result[2].strip()[3:], "上映时间":result[3].strip()[5:] }
4)编写函数,利用json库将字典转成字符串,写入文件。具体代码实现如下:
#将内容写入文件def write_to_file(content): with open("result.txt","a",encoding="utf-8") as f: #把字典转换成字符串写入文件 f.write(json.dumps(content,ensure_ascii=False)+"\n") f.close()
5)编写主函数,循环所有的页面,以改变offset值的方式实现翻页,具体代码实现如下:
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)
6)程序入口,利用多线程,并行执行数据抓取,具体代码如下:
if __name__=="__main__": #利用多进程,使用数据并行抓取 pool=Pool() pool.map(main,[i*10 for i in range(10)])
抓取结果,如下所示:
完整代码下载地址:https://gitee.com/TianYaBenXiong/PaQuBangDanLeiWangZhan-MiaoYan
- 多进程,Request+正则表达式爬取榜单类网站
- request+正则表达式爬猫眼
- 正则表达式网站
- 正则表达式配对“网站”
- 正则表达式测试网站
- 正则表达式 学习网站
- 正则表达式测试网站
- 正则表达式学习-网站
- 正则表达式网站
- 一个正则表达式的网站
- 正则表达式的学习网站
- 网站常用正则表达式收集
- 正则表达式测试网站推荐
- 做网站常用正则表达式
- 正则表达式的学习网站
- 正则表达式自动生成网站
- 两个正则表达式检测网站
- 自动正则表达式生成网站
- TaildirSource(Flume中实现)
- Visual Studio 实用扩展推荐
- linux安装MySQL5.7.20
- caffe训练自己的图片分类模型
- java反射机制的作用
- 多进程,Request+正则表达式爬取榜单类网站
- iOS开发中的单选与多选
- gcd 实际例子编写
- libgdx g3d模型漫反射+镜面在vivo xplay等机子上glsl编译不过解决办法
- 如何使用logcat记录所有页面的加载时间
- java 字符串 分割 split 方法
- java系统高并发解决方案
- 消息中间件mq处理分布式事务
- 反射获取类的所有属性包括父类