用Requests和正则表达式爬取猫眼电影(TOP100+最受期待榜)
目标站点分析
目标站点(猫眼榜单TOP100):
如下图,猫眼电影的翻页offset明显在URL中,所以只要搞定第一页的内容加上一个循环加上offset就可以爬取前100。
流程框架
1、抓取单页内容
利用requests请求目标站点,得到单个网页HTML代码,返回结果。
2、正则表达式分析
根据HTML代码分析得到电影的排名、地址、名称、主演、上映时间、评分等信息。
3、保存至文件
通过文件的形式将结果保存,每一部电影一个结果一行Json字符串。
4、开启循环及多线程
对多页内容遍历,开启多线程提高抓取速度。
实战
1、抓取单页内容
兴致勃勃地码了一段代码,用来获得第一页的内容:
import requests
from requests.exceptions import RequestException#提取单页内容,用try,except方便找bug
def get_one_page(url):try:response = requests.get(url) if response.status_code == 200:#如果状态码为200,说明请求成功return response.textreturn response.status_code#否则请求失败,返回状态码果except RequestException:return Nonedef main():url= 'http://maoyan.com/board/4'html = get_one_page(url)print(html)if __name__ == '__main__':main()
结果很尴尬,直接来了个403状态码,说明请求失败了。
回顾一下之前学的知识:使用Requests库来进行爬虫的详解
headers在爬虫中是非常必要的,很多时候如果请求不加headers,那么你可能会被禁掉或出现服务器错误…
解决办法:加入headers试试看(做一个浏览器的伪装),只需要向get方法传入headers参数就好了,具体的headers内容直接就用文中给出的例子就行。
import requests
from requests.exceptions import RequestExceptionheaders = {'User-Agent':'Mozilla/5.0(Macintosh;Intel Mac OS X 10_11_4)AppleWebKit/537.36(KHTML,like Gecko)Chrome/52.0.2743.116 Safari/537.36'}
#提取单页内容,用try,except方便找bug
def get_one_page(url):try:response = requests.get(url, headers=headers)#传入headers参数if response.status_code == 200:return response.textreturn response.status_codeexcept RequestException:return Nonedef main():url= 'http://maoyan.com/board/4'html = get_one_page(url)print(html)if __name__ == '__main__':main()
呼呼,打印出了一堆内容,说明这回已经请求成功了。再次说明了请求时加入headers参数的重要性。
2、正则表达式分析
我们想要从爬取到的内容中提取6个信息:排名,封面(超链接),标题,演员,上映时间,评分。
先来看看每一个电影在网页中的结构是怎样的,这样才能知道该怎么写正则表达式:
仔细研究上图,红框中的正是我们要提取的信息,那么只要将它们置于正则表达式的7个括号中(最后的评分是分开的,所以需要2个括号来选中),并且在括号两旁做出正确的限定,那么这个正则表达式还是很好写的。
代码如下(注意要导入re库):
def parse_one_page(html):#定义一个函数用来解析html代码#生成一个正则表达式对象pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a' #此处换行+'.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'+'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',re.S)items = re.findall(pattern,html)
对输出的结果再进行格式化处理,使输出更美观:
#items是一个list,其中的每个内容都是一个元组
#将杂乱的信息提取并格式化,变成一个字典形式for item in items:yield { #构造一个字典'index': item[0],'image': item[1],'title': item[2],'actor': item[3].strip()[3:],#做一个切片,去掉“主演:”这3个字符'time': item[4].strip()[5:],#做一个切片,去掉“上映时间:”这5个字符'score': item[5]+item[6]#将小数点前后的数字拼接起来}
再修改一下main函数:
def main():url= 'http://maoyan.com/board/4'html = get_one_page(url)for item in parse_one_page(html):#item是一个生成器print(item)
运行一下看看:
效果还可以吧~
3、保存至文件
定义一个函数用来将上面提取的信息保存到文件中:
def write_to_file(content):with open('result.txt','a',encoding='utf-8') as f:#a表示模式是“追加”;采用utf-8编码可以正常写入汉字f.write(json.dumps(content, ensure_ascii = False) + '\n')#不允许写入ascii码#content是一个字典,我们需要转换成字符串形式,注意导入json库 f.close()
再修改一下main函数:
def main():url= 'http://maoyan.com/board/4'html = get_one_page(url)for item in parse_one_page(html):#item是一个生成器print(item)write_to_file(item)
运行一下看看:
成功保存为文件啦,看看内容,没问题:
4、开启循环及多线程
循环:
再看看网页的特点,点击下一页时,offset这个参数会增加10:
我们只需要修改一下主函数就可以了,给它添加一个offset参数,实现10个页面的抓取:
def main(offset):url= 'http://maoyan.com/board/4?offset='+str(offset)#把offset参数以字符串形式添加到url中html = get_one_page(url)for item in parse_one_page(html):#item是一个生成器print(item)write_to_file(item)
还有起始部分:
if __name__ == '__main__':for i in range(10):#构造一个数组实现0,10,20,...,90的循环main(i*10)
运行看看结果(为了展示更美观,在代码中把超链接这个信息去掉了):
很棒!
多进程
采用多进程的方法可以提高运行的效率:
from multiprocessing import Pool
if __name__ == '__main__':pool = Pool()#创建一个进程池pool.map(main,[i*10 for i in range(10)])#map方法创建进程(不同参数的main),并放到进程池中
总结
非常顺利的爬取了猫眼电影TOP100,关键在于正则表达式的写法。
全部代码如下:
import requests
from requests.exceptions import RequestException
import re
import json
from multiprocessing import Poolheaders = {'User-Agent':'Mozilla/5.0(Macintosh;Intel Mac OS X 10_11_4)AppleWebKit/537.36(KHTML,like Gecko)Chrome/52.0.2743.116 Safari/537.36'}
#提取单页内容,用try,except方便找bug
def get_one_page(url):try:response = requests.get(url, headers=headers)#传入headers参数if response.status_code == 200:return response.textreturn response.status_codeexcept RequestException:#捕获这个类型的异常return Nonedef parse_one_page(html):#定义一个函数用来解析html代码#生成一个正则表达式对象pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a' #此处换行+'.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'+'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',re.S)items = re.findall(pattern,html)#items是一个list,其中的每个内容都是一个元组#将杂乱的信息提取并格式化,变成一个字典形式for item in items:yield { #构造一个字典'index': item[0],#'image': item[1],'title': item[2],'actor': item[3].strip()[3:],#做一个切片,去掉“主演:”这3个字符'time': item[4].strip()[5:],#做一个切片,去掉“上映时间:”这5个字符'score': item[5]+item[6]#将小数点前后的数字拼接起来}def write_to_file(content):with open('result.txt','a',encoding='utf-8') as f:#a表示模式是“追加”;采用utf-8编码可以正常写入汉字f.write(json.dumps(content, ensure_ascii = False) + '\n')#不允许写入ascii码#content是一个字典,我们需要转换成字符串形式,注意导入json库 f.close()def main(offset):url= 'http://maoyan.com/board/4?offset='+str(offset)#把offset参数以字符串形式添加到url中html = get_one_page(url)for item in parse_one_page(html):#item是一个生成器print(item)write_to_file(item)if __name__ == '__main__':pool = Pool()#创建一个进程池pool.map(main,[i*10 for i in range(10)])#map方法创建进程(不同参数的main),并放到进程池中
爬取最受欢迎榜
原理还是一样的,只需要确定一下要筛选什么信息(因为这和TOP100略有不同),并且修改一下正则表达式和一些小细节即可。
def parse_one_page(html):#定义一个函数用来解析html代码pattern = re.compile('<dd>.*?"board-index.*?">(\d+)</i>.*?href.*?data-src.*?</a>.*?board-item-main.*?name">.*?title.*?">(.*?)</a>.*?star">(.*?)</p>.*?'+'releasetime">(.*?)</p>.*?</dd>', re.S)items = re.findall(pattern, html)#items是一个list,其中的每个内容都是一个元组#将杂乱的信息提取并格式化,变成一个字典形式for item in items:yield { #构造一个字典'index': item[0],#'image': item[1],'title': item[1],'actor': item[2].strip()[3:],#做一个切片,去掉“主演:”这3个字符'time': item[3].strip()[5:],#做一个切片,去掉“上映时间:”这5个字符}
结果:
用Requests和正则表达式爬取猫眼电影(TOP100+最受期待榜)相关推荐
- 爬虫从头学之Requests+正则表达式爬取猫眼电影top100
爬取思路 当我们想要爬取一个页面的时候,我们要保证思路清晰,爬虫的思路分四个步骤,发起请求,获取响应内容,解析内容,存储内容.根据这四个内容我们的思路就很清晰.以下为具体步骤 使用requests库爬 ...
- python爬取猫眼_python正则表达式爬取猫眼电影top100
用正则表达式爬取猫眼电影top100,具体内容如下 #!/usr/bin/python # -*- coding: utf-8 -*- import json # 快速导入此模块:鼠标先点到要导入的函 ...
- 利用正则表达式爬取猫眼电影TOP100信息
本文利用requests库和正则表达式爬取了猫眼电影TOP100电影信息,并将电影封面和标题.主演等文字信息保存在了本地.本文完整代码链接:https://github.com/iapcoder/Ma ...
- Requests+正则表达式爬取猫眼电影(TOP100榜)
猫眼电影网址:www.maoyan.com 前言:网上一些大神已经对猫眼电影进行过爬取,所用的方法也是各有其优,最终目的是把影片排名.图片.名称.主要演员.上映时间与评分提取出来并保存到文件或者数据库 ...
- 猫眼api html,Requests库+正则爬取猫眼电影Top100
声明:此篇文章主要是观看静觅教学视频后做的笔记,原教程地址:https://cuiqingcai.com/ 流程框架 1.抓取单页内容:利用requests请求目标站点,得到单个网页HTML代码,返回 ...
- requests+正则表达式爬取猫眼电影TOP100
代码: 1 import json 2 from multiprocessing import Pool 3 import requests 4 # http://cn.python-requests ...
- 如何利用 C# 爬取「猫眼电影:最受期待榜」及对应影片信息!
"道路千万条,安全第一条!行车不规范,亲人两行泪!" 这句在影片"流浪地球"中不断重复的话语已经被大家所熟知.为了行车的安全,我们需要遵守规范,提前规划.同样, ...
- python爬虫入门练习:BeautifulSoup爬取猫眼电影TOP100排行榜,pandas保存本地excel文件
传送门:[python爬虫入门练习]正则表达式爬取猫眼电影TOP100排行榜,openpyxl保存本地excel文件 对于上文使用的正则表达式匹配网页内容,的确是有些许麻烦,替换出现任何的差错都会导致 ...
- Python爬虫之requests+正则表达式抓取猫眼电影top100以及瓜子二手网二手车信息(四)...
requests+正则表达式抓取猫眼电影top100 一.首先我们先分析下网页结构 可以看到第一页的URL和第二页的URL的区别在于offset的值,第一页为0,第二页为10,以此类推. 二.< ...
- 猫眼html源码,50 行代码教你爬取猫眼电影 TOP100 榜所有信息
点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 今天,手把手教你入门 Python 爬虫,爬取猫眼电影 TOP100 榜信息. 作者 | 丁 ...
最新文章
- 用NVIDIA A100 GPUs提高计算机视觉
- 15.泡菜:pickle模块
- Linux多线程——异步
- C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信
- 【GOF23设计模式】原型模式
- 基于混沌的图像置乱加密算法及matlab的实现,基于混沌的图像置乱加密算法及MATLAB的实现...
- 计算机应用技术环境评估,计算机应用教程(第7版)(Windows 7与Office 2007环境)习题解答与上机练习...
- CSS3 创建简单的网页动画 – 实现弹跳球动
- SSH 免密码/免用户名/免IP登录云服务器
- React.createClass和extends Component的区别
- 《Go程序设计语言》- 第12章:反射
- 4步讲解一维数组传参与二维数组传参
- 「 C++ 通讯 」“Socket通信原理(TCP/IP)”研究
- C语言表达式语法分析——递归子程序法
- 题解 [校内测试]图森破
- PS快速选择照片背景
- 关于灾备的重要性解读
- sql语句 execute、executeQuery和executeUpdate之间的区别
- RC并联电路常见应用总结
- Android内核开发 Goldfish Linux Kernel编译及安卓虚拟机测试
热门文章
- winform设置窗体颜色为渐变色
- 【看书】for循环中的定义变量
- python语言特点多模型_GitHub - zkyzq/py-kenlm-model: python | 高效使用统计语言模型kenlm:新词发现、分词、智能纠错等...
- python 多任务:进程,线程相关知识点
- 如何处理分类中的训练数据集不均衡问题
- Linux上的广播教学工具,Linux下用命令行实现录像(Recording and playback of terminal sessions)和广播教学功能...
- Zookeeper入门:第三天
- Tiny6410 老板子修复记录
- MongoDB入门3——更新文档和修改器1
- 设计模式20-中介者模式