php 爬虫抓取网页数据(本节使用Python爬虫抓取猫眼(电影网)影片信息(组图))
优采云 发布时间: 2021-10-05 15:21php 爬虫抓取网页数据(本节使用Python爬虫抓取猫眼(电影网)影片信息(组图))
本节使用Python爬虫抓取猫眼电影TOP100榜单()电影信息,包括电影名称、上映时间、主演信息。
在开始编写程序之前,首先确定页面类型(静态页面或动态页面),其次找出页面的url规则,最后通过分析网页元素的结构来确定正则表达式,从而提取网页信息。
判断页面类型,右键查看页面源码,判断页面中是否存在要抓取的数据。通过浏览可知,所有要抓取的信息都存在于源代码中,因此页面输入为静态页面。如下:
<p class="name">我不是药神
主演:徐峥,周一围,王传君
上映时间:2018-07-05
</p>
确定url规则确定url规则,需要多浏览几页,才能总结出url规则,如下图:
第一页:https://maoyan.com/board/4?offset=0
第二页:https://maoyan.com/board/4?offset=10
第三页:https://maoyan.com/board/4?offset=20
...
第n页:https://maoyan.com/board/4?offset=(n-1)*10
确定正则表达式通过分析网页元素的结构来确定正则表达式,如下图:
<p class="name">我不是药神
主演:徐峥,周一围,王传君
上映时间:2018-07-05</p>
使用 Chrome Developer Debugging Tools 确定要捕获的元素的结构。这样做的原因是可以避免正则表达式的冗余,提高编写正则表达式的速度。正则表达式如下:
.*?title="(.*?)".*?class="star">(.*?).*?releasetime">(.*?)</p></p>
编写正则表达式时,使用(.*?)替换需要提取的信息,使用.*? 替换不需要的内容(包括元素标签)。编写爬虫程序 下面采用面向对象的方法编写爬虫程序,主要编写四个函数,分别是请求函数、分析函数、数据保存函数、主函数。
from urllib import request
import re
import time
import random
import csv
from ua_info import ua_list
# 定义一个爬虫类
class MaoyanSpider(object):
# 初始化
# 定义初始页面url
def __init__(self):
self.url = 'https://maoyan.com/board/4?offset={}'
# 请求函数
def get_html(self,url):
headers = {'User-Agent':random.choice(ua_list)}
req = request.Request(url=url,headers=headers)
res = request.urlopen(req)
html = res.read().decode()
# 直接调用解析函数
self.parse_html(html)
# 解析函数
def parse_html(self,html):
# 正则表达式
re_bds = '.*?title="(.*?)".*?<p class="star">(.*?).*?class="releasetime">(.*?)</p>'
# 生成正则表达式对象
pattern = re.compile(re_bds,re.S)
# r_list: [('我不是药神','徐峥,周一围,王传君','2018-07-05'),...] 列表元组
r_list = pattern.findall(html)
self.save_html(r_list)
# 保存数据函数,使用python内置csv模块
def save_html(self,r_list):
#生成文件对象
with open('maoyan.csv','a',newline='',encoding="utf-8") as f:
#生成csv操作对象
writer = csv.writer(f)
#整理数据
for r in r_list:
name = r[0].strip()
star = r[1].strip()[3:]
# 上映时间:2018-07-05
# 切片截取时间
time = r[2].strip()[5:15]
L = [name,star,time]
# 写入csv文件
writer.writerow(L)
print(name,time,star)
# 主函数
def run(self):
#抓取第一页数据
for offset in range(0,11,10):
url = self.url.format(offset)
self.get_html(url)
#生成1-2之间的浮点数
time.sleep(random.uniform(1,2))
# 以脚本方式启动
if __name__ == '__main__':
#捕捉异常错误
try:
spider = MaoyanSpider()
spider.run()
except Exception as e:
print("错误:",e)
</p>
输出结果:
我不是药神 2018-07-05 徐峥、周以伟、王传君
肖申克的救赎 1994-09-10 蒂姆·罗宾斯、摩根·弗里曼、鲍勃·冈顿
绿皮书 2019-03-01 Vigo Mortensen, Mahsala Ali, Linda Cardrini
海上钢琴家 2019-11-15 蒂姆·罗斯、比尔·纳恩、克兰伦斯·威廉姆斯三世
小偷家族 2018-08-03 中川雅也、安藤樱、松冈墨鱼
霸王别姬 1993-07-26 张国荣、张凤仪、巩俐
哪吒魔童降临人间
美丽人生 2020-01-03 罗伯托·贝尼尼、朱斯蒂诺·杜拉诺、塞尔吉奥·比尼·巴斯特里克
这个杀手不太冷 1994-09-14 让·雷诺、加里·奥德曼、娜塔莉·波特曼
2010-09-01 莱昂纳多·迪卡普里奥、渡边谦、约瑟夫·高登-莱维特