感觉爬虫这种东西久了容易忘,还是写一篇博客来记录一下,以后需要爬取页面的话可以作为参考框架
本篇博客记录的是猫眼电影排行榜电影信息的爬取过程。
页面情况大概是这样的:
现在我们需要爬取到电影的排名、电影名、主演、上映时间、图片链接、评分这六个信息。
爬虫最重要的一步就是要分析网页的源码:
猫眼电影排行榜部分源码.png 上面的一部分源码是第一部《霸王别姬》对应的源码信息,在观察网页代码之后,可以发现,每一部电影都是包含在一对"<dd>"标签里,我们只需要写出关于"<dd>"的正则表达式,就可以进行循环匹配,从而可以得到每一部电影的信息。
先给出我写的正则表达:
s = '<dd>.*?board-index.*?>(.*?)</i>.*?title="(.*?)".*?poster-default.*?src="(.*?)".*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>'
其中开头和结尾决定了只匹配'<dd>'标签的内容;'.*?'代表以非贪婪方式匹配任意多个字符,这个非贪婪模式是我觉得基本上每次爬虫都会用到的,为了获取排名,即为'<i>'标签的内容,我们先找到'</i>',再匹配它前面的内容(排名),通过紧接着排名的符号'>'和后面的符号'</i>'我们就可以锁定‘1’的位置,再加上一个非贪婪匹配即可,小括号的作用是匹配之后可以返回分组,拿到自己想要的内容。
其他的信息匹配原理基本一样,需要耐下心来研读,其实只要练过一次手了,就都会比较简单。
完成正则表达式的匹配模式之后通过
pattern = re.compile(s,re.S)
items = re.findall(pattern,html)
找到所有的匹配结果,这里的items是一个元素为列表的列表(二维列表),每一个元素列表包含了要匹配的信息(6个信息),元素的个数即为该网页的电影个数(这里只匹配单张网页,不进行跳转)
下面给出全部代码
import requests
import re
def get_one_page(url):
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
#如果出现乱码,那么需要加上这条请求头
'Accept-Language':'zh-CN,zh;q=0.9'
}
response = requests.get(url,headers=headers)
if response.status_code == 200:
return response.text
return None
def main():
url = 'https://maoyan.com/board/4'
html = get_one_page(url)
results = parse_one_page(html)
for result in results:
print(result)
#正则提取
def parse_one_page(html):
s = '<dd>.*?board-index.*?>(.*?)</i>.*?title="(.*?)".*?poster-default.*?src="(.*?)".*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>'
pattern = re.compile(s,re.S)
items = re.findall(pattern,html)
for item in items:
print(item)
yield {
'index':item[0],
'title':item[1],
'image':item[2].strip(),
'actor':item[3].strip()[3:] if len(item[3])>3 else '',
'time':item[4].strip(),
'score':item[5].strip()+item[6].strip()
}
main()
目前该代码是可用的,以后网站如果有更新源代码的情况就不好保证了,只是作为一个参考模板。
运行代码以后,应该会出现下面的结果
这样,拿到了数据,就可以进行你想要的的操作了。
下篇预告:爬取街拍美图
网友评论