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

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

     
  • 相关阅读:
    用于Web开发的8 个最好的跨平台编辑器
    javascript之数组操作
    15 个最佳的 jQuery 表格插件
    使用Backbone构建精美应用的7条建议
    linux内核内存分配(一、基本概念)
    redhat的systemd版本list
    Linux内核crash/Oops异常定位分析方法
    systemd bug: bz1437114 core:execute: fix fork() fail handling in exec_spawn()
    Use gdb attach pid and debug it
    Build rpm example:zram
  • 原文地址:https://www.cnblogs.com/ConnorShip/p/9966290.html
Copyright © 2011-2022 走看看