zoukankan      html  css  js  c++  java
  • 使用Request+正则抓取猫眼电影(常见问题)

    目前使用Request+正则表达式,爬取猫眼电影top100的例子很多,就不再具体阐述过程!

    完整代码github:https://github.com/connordb/Top-100

    总结一下,容易出错的问题有:

       1.没有加请求头,导致输出没有具体信息!

    headers={
    "User-Agent": "Mozilla / 5.0(Windows NT 6.1) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 67..3396.99 Safari / 537.36"
    }
    2.正则出问题:

    这个没有好的办法,只能写一点,然后打印输出,看看是否正确输出,常见的问题:另起一行要有+号;另起一行的时候头尾要有引号;
    具体要抓取的内容要用();
    pattern=re.compile('<dd>.*?board-index.*?>(d+)</i>.*?title="(.*?)".*?star">(.*?)</p>.*?setime">(.*?)</p>'
    +'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',re.S)

    3.写入文件出现问题:

    在写入文件的时候,当你输入f.write(content)会报错,报错内容显示只能写入字符串格式,而不是字典格式,此时解决办法是写入

    f.write(json.dumps(conten))
    当你成功输出数据时,发现没有换行,此时加入换行符
    f.write(json.dumps(conten)+'/n')
    当你成功输出数据时,发现汉字没有显示出来,此时需要把with open('maoyan.txt','a')改为

    with open('maoyan.txt','a',encoding='utf-8'),
    f.write(json.dumps(conten))改为f.write(json.dumps(conten,ensure_ascii=False))

    数据输出保存成功!

    接下来我们比较一下加多进程的好处:
    #!/usr/bin/python
    # -*- coding:<utf-8> -*-
    import requests
    import time
    from requests.exceptions import RequestException
    import re
    import json
    
    def get_one_page(url):
        try:
            headers={
                "User-Agent": "Mozilla / 5.0(Windows NT 6.1) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 67..3396.99 Safari / 537.36"
            }
            response=requests.get(url,headers=headers)
            if response.status_code==200:
                return response.text
            return None
        except RequestException:
            return None
    def parse_one_page(html):
        pattern=re.compile('<dd>.*?board-index.*?>(d+)</i>.*?title="(.*?)".*?star">(.*?)</p>.*?setime">(.*?)</p>'
                           +'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',re.S)
        items=re.findall(pattern,html)
        #print(items)
        for item in items:
            yield{
                'index':item[0],
                'name':item[1],
                'actor':item[2].strip()[3:],
                'date':item[3].strip()[5:],
                'grade':item[4]+item[5]
            }
    def write_to_file(content):
        with open('maoyan1.txt','a',encoding='utf-8') as f:
            f.write(json.dumps(content,ensure_ascii=False)+'
    ')
            f.close
    def main(offset):
        url='http://maoyan.com/board/4?offset='+str(offset)
        html=get_one_page(url)
        parse_one_page(html)
        for item in parse_one_page(html):
            print(item)
            write_to_file(item)
        #print(html)
    
    if __name__ == '__main__':
        start=time.time()
        for i in range(10):
            main(i*10)
        end=time.time()
        print('运行时间:',end-start)
    
    
    

     输出结果为:运行时间: 1.7671008110046387

        当加入多进程以后:

    #!/usr/bin/python
    # -*- coding:<utf-8> -*-
    import requests
    import time
    from requests.exceptions import RequestException
    import re
    import json
    from multiprocessing import Pool
    
    def get_one_page(url):
        try:
            headers={
                "User-Agent": "Mozilla / 5.0(Windows NT 6.1) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 67..3396.99 Safari / 537.36"
            }
            response=requests.get(url,headers=headers)
            if response.status_code==200:
                return response.text
            return None
        except RequestException:
            return None
    def parse_one_page(html):
        pattern=re.compile('<dd>.*?board-index.*?>(d+)</i>.*?title="(.*?)".*?star">(.*?)</p>.*?setime">(.*?)</p>'
                           +'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',re.S)
        items=re.findall(pattern,html)
        #print(items)
        for item in items:
            yield{
                'index':item[0],
                'name':item[1],
                'actor':item[2].strip()[3:],
                'date':item[3].strip()[5:],
                'grade':item[4]+item[5]
            }
    def write_to_file(content):
        with open('maoyan1.txt','a',encoding='utf-8') as f:
            f.write(json.dumps(content,ensure_ascii=False)+'
    ')
            f.close
    def main(offset):
        url='http://maoyan.com/board/4?offset='+str(offset)
        html=get_one_page(url)
        parse_one_page(html)
        for item in parse_one_page(html):
            print(item)
            write_to_file(item)
        #print(html)
    
    if __name__ == '__main__':
        start=time.time()
        # for i in range(10):
        #     main(i*10)
        pool=Pool()
        pool.map(main,[i*10 for i in range(10)])
        end=time.time()
        print('运行时间:',end-start)
        #main()

    此时输出结果:运行时间: 1.0980627536773682

    所以:

    不加多进程运行时间: 1.7671008110046387,加多进程运行时间:1.0980627536773682

    因此加了进程池以后,大大提高了代码运行速度!

     
  • 相关阅读:
    ssh批量远程执行脚本screen后台运行
    使用screen共享shell会话(终端共享)
    php获取一个月前的时间戳,获取三个月前的时间戳,获取一年前的时间戳
    jquery 鼠标经过延时触发事件,jquery插件
    jquery 克隆div 复制div 克隆元素 复制元素
    js实现一个可以兼容PC端和移动端的div拖动效果
    完美实现鼠标拖拽事件,解决各种小bug,基于jquery
    js将秒转换为 分:秒 函数
    php将秒转换为 分:秒 函数
    phpStudy启动失败时的解决方法 提示缺vc9运行库
  • 原文地址:https://www.cnblogs.com/ConnorShip/p/9966290.html
Copyright © 2011-2022 走看看