美文网首页
python3爬虫项目实战(一)抓取猫眼电影排行榜

python3爬虫项目实战(一)抓取猫眼电影排行榜

作者: Thunder_Storm | 来源:发表于2020-02-25 14:57 被阅读0次

感觉爬虫这种东西久了容易忘,还是写一篇博客来记录一下,以后需要爬取页面的话可以作为参考框架
本篇博客记录的是猫眼电影排行榜电影信息的爬取过程。
页面情况大概是这样的:

电影排行榜
现在我们需要爬取到电影的排名、电影名、主演、上映时间、图片链接、评分这六个信息。
爬虫最重要的一步就是要分析网页的源码:
猫眼电影排行榜部分源码.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()

目前该代码是可用的,以后网站如果有更新源代码的情况就不好保证了,只是作为一个参考模板。

运行代码以后,应该会出现下面的结果

代码运行结果
这样,拿到了数据,就可以进行你想要的的操作了。
下篇预告:爬取街拍美图

相关文章

网友评论

      本文标题:python3爬虫项目实战(一)抓取猫眼电影排行榜

      本文链接:https://www.haomeiwen.com/subject/wmctchtx.html