Python3 requests和re库对猫眼电影TOP100进行多进程爬取。

  • A+
所属分类:python网络爬虫

首页测试

  1. # -*- coding: utf-8 -*-
  2. """
  3.  
  4. 爬取的相关信息有:电影名次、电影名称、主演、上映时间、评分
  5.  
  6. """
  7. import re
  8. import time
  9. import requests
  10. from multiprocessing import Pool
  11. from requests.exceptions import RequestException
  12. #根据url获取HTML文件
  13. def getHTML(url, code='utf-8'):
  14. #创建个头文件。
  15.     header = {
  16.         'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0',
  17.     }
  18.     try:
  19.         response = requests.get(url, headers=header)
  20.         response.raise_for_status()
  21.         response.encoding = code
  22.         return response.text
  23.     except RequestException:
  24.         print('getHTML Error')
  25. #对HTML进行正则表达式处理
  26. def parseHTML(html):
  27.     pattern = re.compile('board-index-.*?">(.*?)</i>.*?class="name">.*?'
  28.                          + '"boarditem-click".*?"{movieId:.*?}">+(.*?)</a>.*?class="star">'
  29.                          + '(.*?)</p>.*?class="releasetime">(.*?)</p>.*?<p class="score">'
  30.                          + '<i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p>', re.S)
  31.     items = re.findall(pattern, html)
  32.     for item in items:
  33.         yield {
  34.             '序号': item[0],
  35.             '电影名': item[1],
  36.             '主演': item[2].strip(),
  37.             '上映时间': item[3],
  38.             '评分': item[4] + item[5],
  39.         }
  40. #把数据保存到本地
  41. def writePAGE(content):
  42.     with open('result.txt', 'a' ) as f:
  43.         f.write(str(content) + '\n')
  44.         f.close()
  45. #编写主函数
  46. def main(page):
  47.     url = 'https://maoyan.com/board/4?offset=' + str(page)
  48.     html = getHTML(url)
  49.     items = parseHTML(html)
  50.     for item in items:
  51.         print(item)
  52.         writePAGE(item)
  53. if __name__ == '__main__':
  54.     start = time.time()
  55. #多进程爬取
  56.     pool = Pool()
  57.     pool.map(main, [page * 10 for page in range(10)])
  58.     pool.close()  # 关闭进程池,不接受新的进程
  59.     pool.join()  # 主进程阻塞等待子进程的退出
  60.     end = time.time()
  61. #打印出最后运行的时间
  62.     print('It spends %s s' % (end - start))
weinxin
我的微信公众号
爱真理,得永生!          爱在灵灵久博客,网罗天下,福利大家!

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: