Python爬虫实战Pro | (1) 爬取猫眼电影Top100榜单
在本篇博客中,我们将使用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榜单相关推荐
- 爬取猫眼电影TOP100榜单
爬取猫眼电影Top100榜单 分析网页 内容提取 前提:会基础的python3以及requests库,正则等. 分析网页 top100榜单网址为https://maoyan.com/board/4,通 ...
- 爬虫实战4:爬取猫眼电影排名Top100的详细数据保存到csv文件
申明:资料来源于网络及书本,通过理解.实践.整理成学习笔记. 文章目录 猫眼电影 完整代码 运行结果 猫眼电影 完整代码 import time import requests import re i ...
- Python爬取猫眼电影TOP100榜
Python爬取猫眼电影TOP100榜 兴趣点: 这个没什么特别的兴趣,只是单纯爬猫眼练手的人太多了,所以我也打算加入他们,对猫眼员工说一声不好意思了,哈哈哈! 爬取网址: 传送门:https://m ...
- 猫眼html源码,50 行代码教你爬取猫眼电影 TOP100 榜所有信息
点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 今天,手把手教你入门 Python 爬虫,爬取猫眼电影 TOP100 榜信息. 作者 | 丁 ...
- 50 行代码教你爬取猫眼电影 TOP100 榜所有信息
点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 今天,手把手教你入门 Python 爬虫,爬取猫眼电影 TOP100 榜信息. 作者 | 丁 ...
- python爬电影_Python爬虫项目--爬取猫眼电影Top100榜
本次抓取猫眼电影Top100榜所用到的知识点: 1. python requests库 2. 正则表达式 3. csv模块 4. 多进程 正文 目标站点分析 通过对目标站点的分析, 来确定网页结构, ...
- Python爬虫之requests+正则表达式抓取猫眼电影top100以及瓜子二手网二手车信息(四)...
requests+正则表达式抓取猫眼电影top100 一.首先我们先分析下网页结构 可以看到第一页的URL和第二页的URL的区别在于offset的值,第一页为0,第二页为10,以此类推. 二.< ...
- Requests+正则表达式爬取猫眼电影(TOP100榜)
猫眼电影网址:www.maoyan.com 前言:网上一些大神已经对猫眼电影进行过爬取,所用的方法也是各有其优,最终目的是把影片排名.图片.名称.主要演员.上映时间与评分提取出来并保存到文件或者数据库 ...
- Python爬虫实战(一):爬取豆瓣电影top250排名
先上代码 #coding=utf-8 import re import urllib.requestdef getHtml(url):page = urllib.request.urlopen(url ...
最新文章
- 为什么分散刷新没有死时间_分散项目为何失败(以及如何处理)
- P1134 阶乘问题
- Windows server 2008 r2 开启Aero
- Nginx图片剪裁模块探究 http_image_filter_module
- LightOJ 1197 Help Hanzo 素数筛
- 精品软件 推荐 DiskGenius专业版 磁盘管理软件 4.7 注册版本分享
- Error starting ApplicationContext. To display the auto-configuration report re-run your application
- Linux内核网络分层模型——skb核心操作
- 记一次阴阳师挂机脚本开发
- 零代码变更,巧用 Reloader 快速实现 Kubernetes 的 Configmap 和 Secret 热更新
- Tableau 群集部署
- 教你用JavaScript制作图片回廊
- 计算机南北桥芯片的作用
- 重装VS6时,弹出Setup Was Unable to Create a DCOM User Account错误的解决方法
- 十本Android开发学习书籍下载链接
- 小指数rsa 多线程版writeup
- 设计模式六大原则及常用模式详解
- [pwn][堆利用]house of spirit[例题:lctf2016_pwn200]
- MySQL数据库简介数据库介绍
- 通信基础概念(三)相关与正交