多进程,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