美文网首页
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