美文网首页
Python爬虫-猫眼电影排行

Python爬虫-猫眼电影排行

作者: Githubforusc | 来源:发表于2018-11-23 19:57 被阅读0次

    爬虫的目标

    爬取猫眼电影TOP100的电影名称,时间,评分,图片等信息

    猫眼TOP100网站:http://maoyan.com/board/4


    抓取分析


    查看网页源代码,找到对应的目标信息,发现一部电影对应的源代码是一个dd节点



    抓取首页

    为了方便,这里先抓取第一页的内容,运行之后,可以查看到网页的源代码,之后需要对页面进行解析。

    import requests
    def get_one_page(url):
        headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'  
        }  #头信息,爬取一些网站时需要加上,否则可能会爬取失败
        response = requests.get(url,headers=headers)
        if (response.status_code==200):
            return response.text  #返回网页内容
        return None
    
    def main():
        url = 'http://www.maoyan.com/board/4'
        html = get_one_page(url)
        print(html)
    main()
    

    正则匹配

    正则表达式匹配对应的电影排名,图片,名称,内容,主演,发布时间,评分等7个内容
    首先先看看正则匹配电影排名:<dd>.?board-index.?>(.*?)</i>
    (.*?)是方便可以用group()得到所要的结果
    下面贴出爬取以上7种的正则表达式(较复杂,在后续的文章中会改进,这里只做简单使用)
    <dd>.?board-index.?>(.?)</i>.?data-src="(.?)".?name.?a.?>(.?)</a>.?star.?>(.?)</p>.?releasetime.?>(.?)</p>.?integer.?>(.?)</i>.?fraction.?>(.?)</i>.?</dd>

    通过调用findall()方法提取所有内容,接下来,我们定义一个解析页面的方法parse_one_page(),代码如下

    def parse_one_page(html):
        pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)
        items = re.findall(pattern,html)
        print(items)
    

    成功将一页的信息打印出来,以列表的形式,下面是输出结果:


    将提取的匹配结果从列表转换成字典格式

    def parse_one_page(html):
        pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)
        items = re.findall(pattern,html)
        for item in items:
            yield{
                'index':item[0],
                'image':item[1],
                'title':item[2].strip(),
                'actor':item[3].strip()[3:] if len(item[3])>3 else '',
                'time':item[4].strip()[5:] if len(item[4])>5 else '',
                'score':item[5].strip() + item[6].strip()
                }
    

    写入文件

    dumps是将dict转化成str格式
    content是一个字典类型的数据,一部电影的提取结果
    ensure_ascii=False保证写入文件的是中文而不是Unicode编码

    def write_to_file(content):
        with open('result.txt','a',encoding='utf-8') as f:
            print(type(json.dumps(content)))
            f.write(json.dumps(content,ensure_ascii=False)+'\n')
    

    分页爬取

    if __name__=='__main__':
        for i in range(10):
            main(offset=i*10)
            time.sleep(1)
    

    本章总结

    通过本次练习,加强掌握requests和re库的用法,这只是一个简单的爬虫实例,后续会继续更新更多的爬虫文章
    ps:参考教程:Python3爬虫开发实战
    源代码会在后续中上传至github

    相关文章

      网友评论

          本文标题:Python爬虫-猫眼电影排行

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