python写爬虫爬取需要的数据比较容易,以Python简洁的语法和一大波成熟的库,写起来相当的快

python的版本以及使用的库

  • Python 3.6.4
  • requests
  • lxml

这次主要是爬取猫眼的热映电影,网址为http://maoyan.com/films

新建个项目

我用 类(Class) 的方式创建,并初始化需要使用的参数

class MaoYanHot:def __init__(self):self.session = requests.session()  # requests库的session对象能够帮我们跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookiesself.baseUrl = 'http://maoyan.com/films'# 设置requests请求的headers参数来模拟浏览器访问self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11','Accept': 'text/html;q=0.9,*/*;q=0.8','Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3','Accept-Encoding': 'gzip','Connection': 'close','Referer': None  # 注意如果依然不能抓取的话,这里可以设置抓取网站的host}# 开始访问def run(self, pages='?offset=0'):url = self.baseUrl + pagesprint('获取url:' + url)MaoYanHot = MaoYanHot()
MaoYanHot.run()
复制代码

获取正在热映电影首页数据

写个def来获取网页内容,并在run里面调用

# 获取网页内容
def getHtmlContent(self, url):try:respone = self.session.get(url, headers=self.headers)if respone.status_code == 200:# 这里的编码取决于网页编码# 在decode的时候指定错误处理方式,有strict, ignore和replace三种处理方式,strict是默认的也就是抛出异常,ignore是忽略非法字符return respone.content.decode('utf-8', 'ignore')  return Falseexcept Exception as e:print('err1:' + str(e))return False
复制代码

run里面调用contents = self.getHtmlContent(url)

如果顺利的话就会得到HTML内容,通过HTML发现dd标签并没有闭合需要处理下

通过etree.HTML我发现并不能正确闭合dd标签,造成层层嵌套,写个例子测试下

from lxml import etreeaaa = '''
<dl><dd>1111<dd>1111<dd>1111<dd>1111
</dl>
'''
bbb = etree.HTML(aaa)
print(etree.tostring(bbb))
复制代码

打印的结果是b'<html><body><dl>\n <dd>1111\n <dd>1111\n <dd>1111\n <dd>1111\n</dd></dd></dd></dd></dl>\n</body></html>'

把HTML转为XML

手动闭合dd后通过etree.HTML把HTML转为XML,利用xpath语法可以快速匹配我们需要的节点。

# 把html转为xml
def htmlToXml(self, contents):# 手动闭合dd标签contents = contents.replace('<dd', '</dd><dd')return etree.HTML(contents)
复制代码

run里面调用xmls = self.htmlToXml(contents)
再来看看电影结构组成,如下图

我们可以看到电影数据都是在dd里面,评分分为 暂无评分具体评分 2种,父元素是dl,而它的class[movie-list]在页面只有一个。

获取电影的名称和评分

接下来写个def分析需要的电影数据,如电影的名称和评分

# 利用xpath解析html内容def parsingHtml(self, html):try:# 选择文档中的节点,而不考虑它们的位置。选取属性class="movie-list"的 dl 节点,这里返回的是dd列表集合movieList = html.xpath('//dl[@class="movie-list"]/dd') if len(movieList):for item in movieList:# 从当前的 dd 节点选取属性data-act="movies-click"的 a 的节点的文本内容,这里匹配的是电影名称movieName = item.xpath('.//a[@data-act="movies-click"]/text()')[0]# 从当前的 dd 节点选取属性class="channel-detail channel-detail-orange的 div 的节点的文本内容,这里匹配的是暂无评分moviePa = item.xpath('.//div[@class="channel-detail channel-detail-orange"]/text()')# moviePa没有值说明是有具体评分if not moviePa:# 匹配评分的整数integer = item.xpath('.//div[@class="channel-detail channel-detail-orange"]/i[@class="integer"]/text()')# 匹配评分的小数fraction = item.xpath('./div[@class="channel-detail channel-detail-orange"]/i[@class="fraction"]/text()')moviePa = integer + fractionyield({'movieName': movieName,'moviePa': ''.join(moviePa)})returnexcept Exception as e:print('err2:' + str(e))return
复制代码

run里面调用movieList = self.parsingHtml(xmls),通过for循环打印电影数据

for item in movieList:strs = '电影:%s -- 评分: %s' % (item['movieName'], item['moviePa'])print(strs)
复制代码

输出如下:

获取url:http://maoyan.com/films?offset=0
电影:复仇者联盟3:无限战争 -- 评分: 8.6
电影:我是你妈 -- 评分: 8.2
电影:后来的我们 -- 评分: 8.1
电影:超时空同居 -- 评分: 8.8
电影:寂静之地 -- 评分: 暂无评分
电影:幕后玩家 -- 评分: 8.1
电影:狂暴巨兽 -- 评分: 9.0
电影:战犬瑞克斯 -- 评分: 8.2
电影:巴霍巴利王2:终结 -- 评分: 8.7
电影:亲爱的,我要和别人结婚了 -- 评分: 8.2
电影:小公主艾薇拉与神秘王国 -- 评分: 5.7
电影:昼颜 -- 评分: 暂无评分
电影:头号玩家 -- 评分: 9.1
电影:七号公馆 -- 评分: 暂无评分
电影:冰雪女王3:火与冰 -- 评分: 8.2
电影:侏罗纪世界2 -- 评分: 暂无评分
电影:玛丽与魔女之花 -- 评分: 8.0
电影:复仇者联盟4 -- 评分: 暂无评分
电影:青年马克思 -- 评分: 8.4
电影:狄仁杰之四大天王 -- 评分: 暂无评分
电影:爱情公寓 -- 评分: 暂无评分
电影:路过未来 -- 评分: 暂无评分
电影:21克拉 -- 评分: 8.2
电影:游侠索罗:星球大战外传 -- 评分: 暂无评分
电影:午夜十二点 -- 评分: 3.5
电影:龙在哪里? -- 评分: 8.6
电影:火魔高跟鞋 -- 评分: 暂无评分
电影:动物世界 -- 评分: 暂无评分
电影:犬之岛 -- 评分: 7.9
电影:厉害了,我的国 -- 评分: 9.6
复制代码

自动获取下一页的数据

自此已经可以请求网页并且获取需要的数据,接下来自动请求下一页。通过分析发现URl都是http://maoyan.com/films拼接?offset=x这个参数,x是当前页数的起始数,第一页x为0,第二页x为30,以此类推。刚好下一页的href就是这个参数。

写个def获取下一个的参数

# 匹配下一页
def getNextPage(self, html):try:# 获取a元素的文本值为下一页的href属性result = html.xpath('//a[text()="下一页"]/@href')return result[0] if len(result) else Falseexcept Exception as e:print('err3:' + str(e))return False
复制代码

run里面通过递归的方式实现自动获取下一页的数据,并随机休眠5-20秒以预防被猫眼拒绝访问

NextPage = self.getNextPage(xmls)if NextPage:sleepTime = random.randint(5, 20)print('休眠时间:%s' % (sleepTime))# time.sleep(sleepTime)sarr = list(range(sleepTime))sarr.sort(reverse=True)for iss in sarr:time.sleep(1)print('倒计时:' + str(iss))self.run(NextPage)
复制代码

到这里已经基本完成了一个爬虫

设置cookie来获取需要登陆的网站的数据

有些网站内容必须需要登陆了才能访问,手动设置cookie的方式应该是比较省力的,通过浏览器登陆网页后,通过F12 - Network - Headers - Request Headers 找到 Cookie 字段里面包含了cookie信息,写个def把字符串转为字典

def dictToCookie(self):cookie_str = 'uuid=1A6E888B4A4B29B16FBA1299108DBE9C716675A309C3BAA9D55E347DEB6E83EC; _lxsdk_cuid=16367a2e6a9c8-0d58eea69a4d89-3c3c5905-1fa400-16367a2e6a9c8; _lxsdk=1A6E888B4A4B29B16FBA1299108DBE9C716675A309C3BAA9D55E347DEB6E83EC; _csrf=89ce8482c620a863330c9ffcaf2e20579a55a76cbd8637ac62a2b9f72c172a7b; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; lt=DiIgzaThdLC5XZdcq4joMkZRpD8AAAAA3QUAAIpNTDuzpXNwUmtKXTXO6i9RayLLEM7KoYPwtHI1-tbRoMyue5EEa87kRKXrkA9SxQ; lt.sig=HiWqeKJoko8oWV-YaVVbIHt4iXQ; __mta=46043675.1526452119497.1526534209978.1526537087635.59; _lxsdk_s=1636cb36a83-aff-08c-b8a%7C%7C2'cookie_dict = dict()for item in cookie_str.split(';'):key, value = item.split('=', 1)  # 1代表只分一次,得到两个数据cookie_dict[key] = valuereturn cookie_dict
复制代码

然后在class__init__里面把字典转为cookiejar并设置cookie

cookie_dict = self.dictToCookie()
self.session.cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
复制代码

完整代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2018-05-16 15:14:06
# @Author  : Your Name (you@example.org)
# @Link    : link
# @Version : 1.0.0
# 获取猫眼热门电影import time
import requests
import random
from lxml import etreeclass MaoYanHot:def __init__(self):self.session = requests.session()self.baseUrl = 'http://maoyan.com/films'self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11','Accept': 'text/html;q=0.9,*/*;q=0.8','Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3','Accept-Encoding': 'gzip','Connection': 'close','Referer': None  # 注意如果依然不能抓取的话,这里可以设置抓取网站的host}cookie_dict = self.dictToCookie()self.session.cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)# 转为字典def dictToCookie(self):cookie_str = 'uuid=1A6E888B4A4B29B16FBA1299108DBE9C716675A309C3BAA9D55E347DEB6E83EC; _lxsdk_cuid=16367a2e6a9c8-0d58eea69a4d89-3c3c5905-1fa400-16367a2e6a9c8; _lxsdk=1A6E888B4A4B29B16FBA1299108DBE9C716675A309C3BAA9D55E347DEB6E83EC; _csrf=89ce8482c620a863330c9ffcaf2e20579a55a76cbd8637ac62a2b9f72c172a7b; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; lt=DiIgzaThdLC5XZdcq4joMkZRpD8AAAAA3QUAAIpNTDuzpXNwUmtKXTXO6i9RayLLEM7KoYPwtHI1-tbRoMyue5EEa87kRKXrkA9SxQ; lt.sig=HiWqeKJoko8oWV-YaVVbIHt4iXQ; __mta=46043675.1526452119497.1526534209978.1526537087635.59; _lxsdk_s=1636cb36a83-aff-08c-b8a%7C%7C2'cookie_dict = dict()for item in cookie_str.split(';'):key, value = item.split('=', 1)  # 1代表只分一次,得到两个数据cookie_dict[key] = valuereturn cookie_dict# 获取网页内容def getHtmlContent(self, url):try:respone = self.session.get(url, headers=self.headers)if respone.status_code == 200:return respone.content.decode('utf-8')return Falseexcept Exception as e:print('err1:' + str(e))return False# 把html转为xmldef htmlToXml(self, contents):# 手动闭合dd标签contents = contents.replace('<dd', '</dd><dd')return etree.HTML(contents)# 利用xpath解析html内容def parsingHtml(self, html):try:movieList = html.xpath('//dl[@class="movie-list"]/dd')if len(movieList):for item in movieList:movieName = item.xpath('.//a[@data-act="movies-click"]/text()')[0]moviePa = item.xpath('.//div[@class="channel-detail channel-detail-orange"]/text()')if not moviePa:integer = item.xpath('.//div[@class="channel-detail channel-detail-orange"]/i[@class="integer"]/text()')fraction = item.xpath('./div[@class="channel-detail channel-detail-orange"]/i[@class="fraction"]/text()')moviePa = integer + fractionyield({'movieName': movieName,'moviePa': ''.join(moviePa)})returnexcept Exception as e:print('err2:' + str(e))return# 匹配下一页def getNextPage(self, html):try:result = html.xpath('//a[text()="下一页"]/@href')return result[0] if len(result) else Falseexcept Exception as e:print('err3:' + str(e))return False# 开始访问def run(self, pages='?offset=18180'):url = self.baseUrl + pagesprint('获取url:' + url)contents = self.getHtmlContent(url)if contents:xmls = self.htmlToXml(contents)movieList = self.parsingHtml(xmls)file_object = open('movie.txt', 'a+', encoding='utf-8')file_object.write('获取url:' + url + "\n")for item in movieList:strs = '电影:%s -- 评分: %s' % (item['movieName'], item['moviePa'])print(strs)file_object.write(strs + "\n")file_object.close()NextPage = self.getNextPage(xmls)if NextPage:sleepTime = random.randint(5, 20)print('休眠时间:%s' % (sleepTime))# time.sleep(sleepTime)sarr = list(range(sleepTime))sarr.sort(reverse=True)for iss in sarr:time.sleep(1)print('倒计时:' + str(iss))self.run(NextPage)else:print('网页内容获取失败')MaoYanHot = MaoYanHot()
MaoYanHot.run()复制代码

转载于:https://juejin.im/post/5afd8b6e6fb9a07a9a111469

python爬取猫眼正在热映电影相关推荐

  1. python实战 scrapy爬取猫眼正在热映电影

    一.目标: 爬取猫眼网站上正在热映的电影及评分情况,保存到mongo的数据库中: 二.具体工作: (1)新建工程: scrapy startproject maoyan cd spider scrap ...

  2. python实战(一)Python爬取猫眼评分排行前100电影及简单数据分析可视化python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化

    python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化 一.抓取数据 需要的库 request库 响应http请求 json库 将文本保存成json形式 pyquery 类似JQ ...

  3. python爬取电影评分_用Python爬取猫眼上的top100评分电影

    代码如下: # 注意encoding = 'utf-8'和ensure_ascii = False,不写的话不能输出汉字 import requests from requests.exception ...

  4. python实战(一)Python爬取猫眼评分排行前100电影及简单数据分析可视化

    python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化 一.抓取数据 需要的库 request库 响应http请求 json库 将文本保存成json形式 pyquery 类似JQ ...

  5. (伪)Python爬取猫眼电影(反反爬虫过程中遇到的坑)

    Python爬取猫眼电影 1.打开一个猫眼电影的URL,例如本月的较火的电影<毒液:致命守护者>http://maoyan.com/films/42964 直接F12,查看审核元素,发现上 ...

  6. python爬取猫眼电影数据

    每天一点点,记录学习每一步 近期爬虫项目: 1:python 爬取菜鸟教程python100题,百度贴吧图片反爬虫下载,批量下载 2:python爬虫爬取百度贴吧图片,requests方法 3:pyt ...

  7. python猫眼电影分析_用Python 爬取猫眼电影数据分析《无名之辈》

    前言 作者: 罗昭成 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 http://note.youdao.com/noteshare?id=3054cce4add8a909e7 ...

  8. 利用python爬取猫眼电影,分析《大侦探皮卡丘》|凹凸数读

    利用python爬取猫眼电影,分析<大侦探皮卡丘>,看看当皮卡丘长出绒毛,"丑拒"还是"真香"都在猫眼短评里了. 本文首发于微信公众号<凹凸数 ...

  9. Python爬取猫眼电影TOP100榜

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

最新文章

  1. 【学术研究基础】聚类分析学习
  2. 【 Verilog HDL 】case, casez, casex 之干货总结
  3. java特征向量计算_用Java和Python计算特征向量的差异
  4. Postmaster主循环的大致流程
  5. neo4j查询多跳关系的方法
  6. 关于最小化的另辟蹊径
  7. 搜索用计算机弹奏9277的数字,计算机基础知识参考试题(含答案)
  8. 显卡RTX 3090运行pytorch报错CUDA error: no kernel image is available for execution on the device
  9. Http Module 介绍
  10. [过年菜谱之]清蒸鲍鱼
  11. 这是目前为止5G最完整的PPT
  12. LeetCode:每日一题(2020.4.13)
  13. 两台redhat7虚拟机配置ssh免密访问
  14. 网络安全综合实验(eNSP)(DHCP、OSPF、NAT、防火墙、ACL)
  15. 科普:什么是IPV4?什么是IPV6?
  16. c语言 code table,单片机C语言unsigned char code table是什么意思?
  17. 微擎弹出确认授权获取用户头像
  18. 自然语言处理--Keras 实现LSTM循环神经网络分类 IMDB 电影评论数据集
  19. Kettle5.2 Carte.bat 页面中文乱码
  20. 用于自动化的 10 个杀手级 Python 脚本

热门文章

  1. 什么是软件著作权证书?安卓app上架要软件著作权吗
  2. 99题 Reorder List
  3. Dubbo:com.alibaba.dubbo.rpc.RpcException Failed to invoke the method 问题的解决
  4. 【无标题】再次吹响号角,扬帆更壮阔的征途——AMD EPYC 7F72/7F52处理器测试
  5. html点击一个文字显示提示框,点击文字弹出一个DIV层窗口代码
  6. dcdc模块降额设计_DCDC(宽压)模块电源应用指南--2018年版目录.PDF
  7. Code Clean读书笔记
  8. android手机刷机后驱动更新失败,安卓5.0刷机失败怎么办?
  9. Attention的汇总与辨析_Additive、Multiplication、Scaled dot-product、Self Attention、Multi-head Self-Attention
  10. SitePoint播客#163:倒下