在本篇博客中,我们将使用requests+正则表达式来爬取猫眼电影官网的TOP100电影榜单,获取每部电影的序号,片名,主演,上映日期,评分和封面等内容。

之前在Python爬虫实战(1)中我们曾爬取过,本篇博客将对上次内容进行升级,使用yield和多线程。

打开猫眼Top100,分析URL的变化:发现Top100榜总共包含10页,每页10部电影,并且每一页的URL都是有规律的,如第2页为https://maoyan.com/board/4?offset=10,第三页为https://maoyan.com/board/4?offset=20。由此可得第n页为https://maoyan.com/board/4?offset=(n-1)*10。

  • 单个页面的爬取
def get_one_page(url):try:headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:return response.textreturn Noneexcept RequestException:return None
  • 解析函数

打开浏览器,右键检查,在element选项卡中,我们发现每部电影都在一对dd标签中:

接下来,我们可以用正则表达式进行提取,用.*?略过没用的部分,保存一些关键部分进行定位,用(.*?)获取想要的信息:

def parse_one_page(html):pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>' #序号+'.*?data-src="(.*?)"'#封面图片+'.*?name.*?<a.*?>(.*?)</a>' #片名+'.*?star.*?>(.*?)</p>' #主演+'.*?releasetime.*?>(.*?)</p>' #上映时间+'.*?score.*?integer.*?>(.*?)</i>' #评分整数部分+'.*?fraction.*?>(.*?)</i>' #评分小数部分,re.S)items = pattern.findall(html)#之前是把每个item保存在字典里,在追加到一个列表中。#现在对于每个item 用yield声明一个迭代器for item in items:yield {'index':item[0],'logo':item[1],'title':item[2],'star':item[3].strip()[3:] if len(item[3])>3 else '', #去除 前后空白字符 和 主演:'releasetime':item[4].strip()[5:] if len(item[4])>5 else '', #去除 前后空白字符 和 上映时间:'score':item[5].strip()+item[6].strip() #去除前后空白字符 拼接评分整数和小数部分}
  • 数据存储

我们把数据直接存储到文本文件中。

def write_to_file(content):with open('result.txt','a',encoding='utf-8') as f:f.write(json.dumps(content,ensure_ascii=False)+'\n') #ensure_ascii=False 可以显示中文字符
  • 设置页面偏移
def main(offset):url = 'https://maoyan.com/board/4?offset='+str(offset)  #新页面urlhtml = get_one_page(url) #获取页面html#print(html)for item in parse_one_page(html): #由于解析函数返回的是一个迭代器 所以需要使用for循环对其进行实体化 print(item)write_to_file(item) #把每个item写入文件
  • 设置多线程
if __name__ == '__main__':'''for i in range(10):main(i*10)time.sleep(1)   '''pool = Pool()pool.map(main,[x*10 for x in range(10)])

正常情况下使用注释掉的部分,对10个页面顺序进行爬取。如果想加速,实现秒抓,可以添加多线程机制,将待爬取的页面分配给多个线程,并行爬取。建立起main函数及其传入参数之间的映射即可。

  • 完整代码
import requests
from requests import RequestException
import re
import json
from multiprocessing.pool import Pooldef get_one_page(url):try:headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:return response.textreturn Noneexcept RequestException:return Nonedef parse_one_page(html):pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>' #序号+'.*?data-src="(.*?)"'#封面图片+'.*?name.*?<a.*?>(.*?)</a>' #片名+'.*?star.*?>(.*?)</p>' #主演+'.*?releasetime.*?>(.*?)</p>' #上映时间+'.*?score.*?integer.*?>(.*?)</i>' #评分整数部分+'.*?fraction.*?>(.*?)</i>' #评分小数部分,re.S)items = pattern.findall(html)#之前是把每个item保存在字典里,在追加到一个列表中。#现在对于每个item 用yield声明一个迭代器for item in items:yield {'index':item[0],'logo':item[1],'title':item[2],'star':item[3].strip()[3:] if len(item[3])>3 else '', #去除 前后空白字符 和 主演:'releasetime':item[4].strip()[5:] if len(item[4])>5 else '', #去除 前后空白字符 和 上映时间:'score':item[5].strip()+item[6].strip() #去除前后空白字符 拼接评分整数和小数部分}def write_to_file(content):with open('result.txt','a',encoding='utf-8') as f:f.write(json.dumps(content,ensure_ascii=False)+'\n') #ensure_ascii=False 可以显示中文字符def main(offset):url = 'https://maoyan.com/board/4?offset='+str(offset)  #新页面urlhtml = get_one_page(url) #获取页面html#print(html)for item in parse_one_page(html): #由于解析函数返回的是一个迭代器 所以需要使用for循环对其进行实体化print(item)write_to_file(item) #把每个item写入文件if __name__ == '__main__':'''for i in range(10):main(i*10)time.sleep(1)   '''pool = Pool()pool.map(main,[x*10 for x in range(10)])
  • 爬取结果

通过观察结果会发现,使用多线程并行爬取后,并不是按顺序爬取的,index并不是连续的。说明每个线程都在独立并行的爬取分配给它的页面。

如果不使用多线程,结果将是顺序爬取的。

Python爬虫实战Pro | (1) 爬取猫眼电影Top100榜单相关推荐

  1. 爬取猫眼电影TOP100榜单

    爬取猫眼电影Top100榜单 分析网页 内容提取 前提:会基础的python3以及requests库,正则等. 分析网页 top100榜单网址为https://maoyan.com/board/4,通 ...

  2. 爬虫实战4:爬取猫眼电影排名Top100的详细数据保存到csv文件

    申明:资料来源于网络及书本,通过理解.实践.整理成学习笔记. 文章目录 猫眼电影 完整代码 运行结果 猫眼电影 完整代码 import time import requests import re i ...

  3. Python爬取猫眼电影TOP100榜

    Python爬取猫眼电影TOP100榜 兴趣点: 这个没什么特别的兴趣,只是单纯爬猫眼练手的人太多了,所以我也打算加入他们,对猫眼员工说一声不好意思了,哈哈哈! 爬取网址: 传送门:https://m ...

  4. 猫眼html源码,50 行代码教你爬取猫眼电影 TOP100 榜所有信息

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 今天,手把手教你入门 Python 爬虫,爬取猫眼电影 TOP100 榜信息. 作者 | 丁 ...

  5. 50 行代码教你爬取猫眼电影 TOP100 榜所有信息

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 今天,手把手教你入门 Python 爬虫,爬取猫眼电影 TOP100 榜信息. 作者 | 丁 ...

  6. python爬电影_Python爬虫项目--爬取猫眼电影Top100榜

    本次抓取猫眼电影Top100榜所用到的知识点: 1. python requests库 2. 正则表达式 3. csv模块 4. 多进程 正文 目标站点分析 通过对目标站点的分析, 来确定网页结构, ...

  7. Python爬虫之requests+正则表达式抓取猫眼电影top100以及瓜子二手网二手车信息(四)...

    requests+正则表达式抓取猫眼电影top100 一.首先我们先分析下网页结构 可以看到第一页的URL和第二页的URL的区别在于offset的值,第一页为0,第二页为10,以此类推. 二.< ...

  8. Requests+正则表达式爬取猫眼电影(TOP100榜)

    猫眼电影网址:www.maoyan.com 前言:网上一些大神已经对猫眼电影进行过爬取,所用的方法也是各有其优,最终目的是把影片排名.图片.名称.主要演员.上映时间与评分提取出来并保存到文件或者数据库 ...

  9. Python爬虫实战(一):爬取豆瓣电影top250排名

    先上代码 #coding=utf-8 import re import urllib.requestdef getHtml(url):page = urllib.request.urlopen(url ...

最新文章

  1. 为什么分散刷新没有死时间_分散项目为何失败(以及如何处理)
  2. P1134 阶乘问题
  3. Windows server 2008 r2 开启Aero
  4. Nginx图片剪裁模块探究 http_image_filter_module
  5. LightOJ 1197 Help Hanzo 素数筛
  6. 精品软件 推荐 DiskGenius专业版 磁盘管理软件 4.7 注册版本分享
  7. Error starting ApplicationContext. To display the auto-configuration report re-run your application
  8. Linux内核网络分层模型——skb核心操作
  9. 记一次阴阳师挂机脚本开发
  10. 零代码变更,巧用 Reloader 快速实现 Kubernetes 的 Configmap 和 Secret 热更新
  11. Tableau 群集部署
  12. 教你用JavaScript制作图片回廊
  13. 计算机南北桥芯片的作用
  14. 重装VS6时,弹出Setup Was Unable to Create a DCOM User Account错误的解决方法
  15. 十本Android开发学习书籍下载链接
  16. 小指数rsa 多线程版writeup
  17. 设计模式六大原则及常用模式详解
  18. [pwn][堆利用]house of spirit[例题:lctf2016_pwn200]
  19. MySQL数据库简介数据库介绍
  20. 通信基础概念(三)相关与正交

热门文章

  1. [PS小教程]漂亮色调一秒变出来
  2. WPS使用开发工具 宏
  3. mysql数据库层级关系图_层次关系数据库表的设计
  4. linux分区_解决Linux下挂载的NTFS分区(Windows分区)只读问题。
  5. 考华为认证HCIA还有含金量吗?
  6. zookeeper从入门到入土
  7. linux常用脚本的使用方法,Linux常用命令用法100个
  8. MySQL绿色解压缩版安装与配置
  9. 图形编程和机器人编程有什么区别
  10. 手机游戏运营必备的数据分析指标