zoukankan      html  css  js  c++  java
  • 爬取猫眼TOP100

    学完正则的一个小例子就是爬取猫眼排行榜TOP100的所有电影信息

    看一下网页结构:

    可以看出要爬取的信息在<dd>标签和</dd>标签中间

    正则表达式如下:

    pattern=re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>'
    +'(.*?)</a>.*?star">(.*?)</p>'
    +'.*?releasetime">(.*?)</p>.*?integer">(.*?)'
    +'</i>.*?fraction">(.*?)</i></p>.*?</dd>',
    re.S)

    源码如下:

    import requests
    import re
    import time
    import json
    
    def get_one_page(url):
        headers={
            'User-Agent': "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5"
        }
        response=requests.get(url,headers=headers)
        if response.status_code==200:
            return response.text
        return None
    
    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></p>.*?</dd>',
            re.S)
    
        '''
        pattern = re.compile('<dd>.*?board-index.*?>(d+)</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 {
                '排名':item[0],
                '图片':item[1],
                '名字':item[2].strip(),
                '演员':item[3].strip()[3:]if len(item[3])>3 else '',
                '时间':item[4].strip()[5:]if len(item[4])>5 else '',
                '评分':item[5].strip()+item[6].strip()
            }
    
    def write_to_file(content):
        with open('movie.txt','a',encoding='utf-8') as f:
            f.write(json.dumps(content,ensure_ascii=False)+'
    ')
    
    def main(offset):
        url='https://maoyan.com/board/4?offset='+str(offset)
        html=get_one_page(url)
        #print(html)
        for item in parse_one_page(html):
            print(item)
            #write_to_file(item)
    
    
    if __name__ == '__main__':
        for i in range(10):
            main(offset=i*10)
            time.sleep(1)

    在弄这个的时候,自己先写了一遍正则,,不过只能爬取每一页的第一条数据,然后就没有下文了,,百思不得解

    然后仔细的和书上的正则匹配,才发现有的地方写错了,通过这个例子,我们可以知道,正则表达式真的麻烦。。。。

    也好难写。

    运行结果:

    最后还将数据保存在本地,,

    GitHub地址:https://github.com/tyutltf/maoyan

  • 相关阅读:
    面试题练习
    小作业7
    小作业6,7
    小作业
    坦克大战
    面试题
    20181213作业
    20181212作业
    20181211作业
    第三周周末作业
  • 原文地址:https://www.cnblogs.com/yuxuanlian/p/10079360.html
Copyright © 2011-2022 走看看