本文是利用多进程、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 requests
from requests.exceptions import RequestException
from multiprocessing import Pool
import re
import json
from 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