利用Python3的requests和re库爬取猫眼电影笔记
以下笔记,作为参考借鉴,如有疑问可以联系我进行交流探讨!
代码思路很简单,简单概括为:
首先利用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))
千行代码,Bug何处藏。 纵使上线又怎样,朝令改,夕断肠。