Python爬取猫眼TOP排行榜 正则表达式和requests模块的使用

Python爬取猫眼TOP排行榜 正则表达式和requests模块的使用

前面我们学习了正则表达式,Requests库,BeauifulSoup库,还有PyQuery库,Urllib库,那么该如何使用呢,完全是看自己爱好,这篇文章就对一些简单的网页来进行信息提取,练习一下

一、采用正则表达式+requests库爬取猫眼电影TOP100榜

分析

  • 1.根据图片分析,我们要采集的所有内容都在标签下,先在中采集排名
  • 2.a标签下第二个img标签是海报地址
  • 3.剩下的内容都在class=”board-item-main”中寻找
import requests
import re
import json
from multiprocessing import Pool  #引入进程池
from requests.exceptions import RequestException
def get_one_url(url): 
    #请求url,加入异常捕捉,一般就是判断状态码,如果不加headers的话会失败
    try:
        headers={'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
        response=requests.get(url,headers=headers)
        if response.status_code==200:
            return response.text
        return '请求错误'
    except RequestException:
        return '请求出错了'
def parse_one_url(html):
    #请求一页数据
    pattern=re.compile('<dd>.*?index.*?">(\d+)</i>'+  #分析正则,把它编译成正则对象
                       '.*?alt=".*?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],  #使用迭代器yield
               'Image':item[1],
               'title':item[2],
               'Author':item[3].strip(),  #这个内容会有空格,两头的空格去掉
               'Time':item[4],
               'Score':item[5]+item[6]}  #评分在两个标签下,所以需要合并下
def write_file(content):
    with open('maoyan.text','a',encoding='utf-8') as f:
        f.write(json.dumps(content,ensure_ascii=False)+'\n')
        f.close()
def main(offset):
    url='https://maoyan.com/board/4?offset='+str(offset) #仔细观察翻页后的网址,发现都是offset=10*range(10)
    html=get_one_url(url)
    for item in parse_one_url(html):
        write_file(item)
if __name__=='__main__':
    for i in range(10): #循环翻页
        main(i*10)
        # pool=Pool()  #采用多进程实现秒抓
        # pool.map(main,[i*10 for i in range(10)])
分享到 :

发表评论

登录... 后才能评论