利用Python3的requests和re库爬取猫眼电影笔记

时间:2021-01-14 19:58:44

以下笔记,作为参考借鉴,如有疑问可以联系我进行交流探讨!

代码思路很简单,简单概括为:
   首先利用requests的get方法获取页面的html文件,之后对得到的html文件进行相对应的正则处理,然后把爬取到的数据保存到本地。

# -*- coding: utf-8 -*-
"""
爬取的相关信息有:电影名次、电影名称、主演、上映时间、评分
 
"""
 
import re
import time
import requests
from multiprocessing import Pool
from http.cookiejar import CookieJar
from requests.exceptions import RequestException
 
#创建requests回话
s = requests.Session()
#对需要登录或者需要利用cookie登录的,可以使用CookieJar( )这个方法。
s.cookies = CookieJar()
 
#创建个头文件,里面的用户我习惯使用这个"Baiduspider+"。
header = {
    'user-agent': 'Baiduspider+',
}
 
#根据url获取HTML文件
def getHTML(url, code='utf-8'):
    try:
        response = s.get(url, headers=header)
        response.raise_for_status()
        response.encoding = code
        return response.text
    except RequestException:
        print('getHTML Error')
 
#对HTML进行正则表达式处理
def parseHTML(html):
    pattern = re.compile('.*?board-index-.*?">(.*?)</i>.*?class="name">.*?'
                         + '"boarditem-click".*?"{movieId:.*?}">+(.*?)</a>.*?class="star">'
                         + '(.*?)</p>.*?class="releasetime">(.*?)</p>.*?<p class="score">'
                         + '<i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p>', re.S)
 
 #需要把html字符串化,否则报错:TypeError: expected string or bytes-like object
    items = re.findall(pattern, str(html))
 
    for item in items:
        yield {
            '序号': item[0],
            '电影名': item[1],
            '主演': item[2].strip(),
            '上映时间': item[3],
            '评分': item[4] + item[5],
        }
 
#把数据保存到本地
def writePAGE(content):
    with open('result.txt', 'a' ) as f:
        f.write(str(content) + '\n')
        f.close()
 
#编写主函数
def main(page):
    url = 'https://maoyan.com/board/4?offset=' + str(page)
    html = getHTML(url)
    items = parseHTML(html)
 
    for item in items:
        print(item)
        writePAGE(item)
 
 
if __name__ == '__main__':
    start = time.time()
 
#多进程爬取
    pool = Pool()
    pool.map(main, [page * 10 for page in range(10)])
    pool.close()  # 关闭进程池,不接受新的进程
    pool.join()  # 主进程阻塞等待子进程的退出
 
    end = time.time()
#打印出最后运行的时间
    print('It spends %s s' % (end - start))