使用Request+正则抓取猫眼电影(常见问题)

巧了我就是萌 提交于 2020-11-22 06:52:07

目前使用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)+'\n')
        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)+'\n')
        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

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

 

 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!