xhr get获取文件流下载文件_python爬虫实战——豆瓣电影get初体验

b7a30ae462b8d2d8e942f4a0321fe4bc.png

影评许可证

公众号[2019]第22期

本栏目由“数据皮皮侠”独家呈献

6da99e0807c90c9708e5786c330118ad.png

专场

python爬虫实战——豆瓣电影get初体验

2019.10.28 / 早上7点场 / 免费

本期“栏目”的四大看点:

1 如何爬取2 如何解析与提取3 如何解析json数据4 实战:爬取豆瓣影视信息

1 如何爬取

how to Obtain

我们老说爬虫,那么具体到底怎么爬?爬什么?

首先,“爬虫四步”:获取数据(包含请求和响应两个动作)、解析数据、提取数据、存储数据。

最简单的请求方式是:requests.get()

代码:

import requestsurl = ''response = requests.get(url)

此外,我们还需要一个工具,叫做Network。在它的帮助下,我们能看到所有的请求,这样我们才能完成爬虫四步

Network能够记录浏览器的所有请求。我们最常用的是:ALL(查看全部)/XHR(仅查看XHR)/Doc(Document,第0个请求一般在这里),有时候也会看看:Img(仅查看图片)/Media(仅查看媒体文件)/Other(其他)。最后,JS和CSS,则是前端代码,负责发起请求和页面实现;Font是文字的字体。

在爬虫里, XHR和Doc是我们最常用的。我们能在Doc里找到一个网页的源代码,而在网页源代码里找不到的信息,通常都能在XHR里找到。有它的存在,人们不必刷新/跳转网页,即可加载新的内容。

2 解析与提取

Parsing and Reading

当数据藏匿于网页源代码,在“爬虫四步”链里,最重要的库叫BeautifulSoup,它能提供一套完整的数据解析、数据提取解决方案。(关于BeautifulSoup的安装和使用,在前期文章中介绍过哦~)

XHR所传输的数据,最重要的一种是用json格式写成的,和html一样,这种数据能够有组织地存储大量内容。json的数据类型是“文本”,我们称为字符串。我们能很容易将json格式的数据转化为列表/字典,反之也可以。

3 如何解析json数据

How to Parse JSON Data

通过Response类支持使用json()方法来将数据转为list/dic,比如:

import requestsr=requests.get(‘http://……’)print(r.json())

请求本身很有意思。requests.get()里面其实只有一个参数,即url。但其实,这个请求可以有多个参数。

params,可以让我们带着参数来请求数据:我想要第几页?我想要搜索的关键词?我想要多少个数据?

headers,请求头。它告诉服务器,我的设备/浏览器是什么?我从哪个页面而来?

再往后,除了get请求之外,还存在着另一种请求方式——post。post区别于get的是:get是明文显示参数,post是非明文显示参数。学会post,又有两个参数可用

(1)在post请求里,我们使用data来传递参数,其用法和params非常相像。

(2)cookies,中文名是“小饼干”。但它却和“小饼干”并无关联。它的作用是让服务器“记住你”,比如一般当你登录一个网站,你都会在登录页面看到一个可勾选的选项“记住我”。如果你点了勾选,服务器就会生成一个cookies和你的账号绑定。接着,它把这个cookies告诉你的浏览器,让浏览器把cookies存储到你的本地电脑。当下一次,浏览器带着cookies访问博客,服务器会知道你是何人,你不需要再重复输入账号密码,就能直接访问。

到这,考虑极端情况。代码可能会是这样:

import requestsurl_1 = 'https://…'headers = {'user-agent':''}data = {}# 定义url,headers和datalogin_in = requests.post(url,headers=headers,data=data)cookies = login_in.cookies# 完成登录,获取cookiesurl_2 = 'https://…'params = {}# 定义url和paramsresponse=requests.get(url,headers=headers,params=params,cookies=cookies)# 带着cookies重新发起请求

4 如何爬取豆瓣电影数据?

Get Douban Movie Data

4.1

创建爬虫文件,获取url地址

地址为:url="https://movie.douban.com/top250"

4.2

使用request获取第一页的请求信息:

import requestsfrom bs4 import BeautifulSoupurl="https://movie.douban.com/top250"wb_data=requests.get(url)# 获取网页文本信息soup=BeautifulSoup(wb_data.text,'lxml')# 从soup中提取我们想要的信息titles=soup.select('div.hd>a')rates=soup.select('span.rating_num')imgs=soup.select('img[]')for title,rate,img in zip(titles,rates,imgs):    data={        'title':list(title.stripped_strings),        'rate':rate.get_text(),        'img':img.get('src')    }    print (data)

4.3

获取多页的请求信息

import requestsfrom bs4 import BeautifulSoupurls=['https://movie.douban.com/top250?start=n&filter=' for n in range(0,250,25)]for url in urls:    wb_data=requests.get(url)    # 获取网页文本信息    soup=BeautifulSoup(wb_data.text,'lxml')    # 从soup中提取我们想要的信息    titles=soup.select('div.hd>a')    rates=soup.select('span.rating_num')    imgs=soup.select('img[]')    for title,rate,img in zip(titles,rates,imgs):        data={            'title':list(title.stripped_strings),            'rate':rate.get_text(),            'img':img.get('src')        }        print(data)

4.4

下载电影图片地址到本地

import requestsfrom bs4 import BeautifulSoupi=0urls=['https://movie.douban.com/top250?start=n&filter=' for n in range(0,250,25)]for url in urls:    wb_data=requests.get(url)    # 获取网页文本信息    soup=BeautifulSoup(wb_data.text,'lxml')    # 从soup中提取我们想要的信息    titles=soup.select('div.hd>a')    rates=soup.select('span.rating_num')    imgs=soup.select('img[]')    for title,rate,img in zip(titles,rates,imgs):        data={            'title':list(title.stripped_strings),            'rate':rate.get_text(),            'img':img.get('src')        }        # 保存图片到本地        i+=1        fileName=str(i)+'、'+data['title'][0]+''+data['rate']+'分.jpg'        pic=requests.get(data['img'])        with open('E:/Envs/douban/douban_imgs/'+fileName,'wb')as photo:            photo.write(pic.content)        print(data)
5c0580da20b65488e65aacf374dbdf27.png

4.5

爬取豆瓣热门美剧存储到mongodb中

将json数据转换为字典,然后根据键subjects循环取出里面的值,取出我们想要的数据

import requests,jsonurl='https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=0'response_data=requests.get(url)# 将json数据转换为字典类型并根据键名循环取出值json_data=json.loads(response_data.text)# 查看键名# print(json_data)for tv in json_data['subjects']:    # print(tv)    # 取出我们需要的数据    data={        'rate':tv['rate'],        'title':tv['title'],        'img_url':tv['cover'],        'id':tv['id'],        # 自定义一个标志        'tag':"美剧"    }    print(data)
b779432651e92ece6d3b63136ce1a59b.png

获取多页数据

import requests,json# url='https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=0'# 这里的200可以修改为更高数字,目前只爬取200条数据urls=['https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start='+str(n) for n in range(0,200,20)]for url in urls:    response_data=requests.get(url)    # 将json数据转换为字典类型并根据键名循环取出值    json_data=json.loads(response_data.text)    # 查看键名    # print(json_data)    for tv in json_data['subjects']:        # print(tv)        # 取出我们需要的数据        data={            'rate':tv['rate'],            'title':tv['title'],            'img_url':tv['cover'],            'id':tv['id'],            # 自定义一个标志            'tag':"美剧"        }        print(data)

 保存数据到mongodb数据库里面

import requests,json,pymongo# url='https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=0'# 这里的200可以修改为更高数字,目前只爬取200条数据client=pymongo.MongoClient(host='localhost',port=27017)db=client.db_bkcollection = db.doubanurls=['https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start='+str(n) for n in range(0,200,20)]for url in urls:    response_data=requests.get(url)    # 将json数据转换为字典类型并根据键名循环取出值    json_data=json.loads(response_data.text)    # 查看键名    # print(json_data)    for tv in json_data['subjects']:        # print(tv)        # 取出我们需要的数据        data={            'rate':tv['rate'],            'title':tv['title'],            'img_url':tv['cover'],            'id':tv['id'],            # 自定义一个标志            'tag':"美剧"        }        collection.insert_one(data)        print(data)
c654c4074150a3fc235522f6702ee7f2.gif

END

本期“ 总导演 ”:李雨萱

本期“ 剪辑师 ”:李嘉楠

本期“栏目”进入尾声了,我们下期再见!

如果你有任何问题欢迎在“栏目下方”留言

关注公众号还可获取更多python的相关内容

bc889c77c44e424a395397cccc6132b1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

商丘高中计算机考试成绩查询系统,2019商丘中考招生成绩查询时间及网站公布...

成绩发布:今年中招成绩满分仍为700分。7月8日,公布中招成绩。考生可以通过“商丘便民网”及手机APP客户端进行查询,也可以登陆省中招平台(http://zk.haedu.gov.cn)和商丘市基础教育公共服务平台(http://www.sqsedu.net…

双时隙的工作原理_OFDM调制技术原理是什么 OFDM调制实现原理介绍【图文】

无线通讯OFDM调制技术原理简介OFDM是现代宽带无线通信系统应用的技术。为了减少高数据率OFDM系统中各信道间影响带来的失真,引入循环前缀(CP)来消除码间干扰(ISI)。它将一个IFFT包的最后部分复制到OFDM符号序列的前端。注意,CP的长度必须长于色散信道的长…

Windows 11 新版 22593 发布:文件资源管理器全新主页,开始菜单图标优化

面向 Dev 和 Beta 频道的 Windows 预览体验成员,微软现已发布 Windows 11 预览版 Build 22593。主要变化1.微软为 Windows 11 文件资源管理器引入了全新的主页功能,集成了快速访问、收藏夹和最近使用的文件。2.Windows 11 “开始”菜单文件夹中的应用程序…

2015年最弱的密码,和最强的密码

网络安全公司SplashData如约发布了本年度最不安全的密码排行榜。这是他们连续第五年做这件事了。 根据2015年从各个渠道泄露出来的密码信息,最弱的密码被“123456”再次蝉联。这个“万年陈酿”的密码排名第一感觉毫无压力。 夺得第二名的是“password”。中国用户似…

ideaspringboot项目上传服务器_nuxt+pm2 自动化部署及打包后文件自动上传阿里云 oss

在读这篇文档时&#xff0c;希望你对 nuxt 及 pm2&#xff0c;有简单的了解nuxtpm2前期准备安装 pm2 及构建 nuxt$ npm i pm2 -g $ npx create-nuxt-app <项目名>ssh 密钥配置pm2 代码自动发布依赖于 git 工具&#xff0c;先将 ssh 密钥配置再你的代码仓库&#xff08;gi…

wait放弃对象锁_Java线程中wait、await、sleep、yield、join用法总结

一、wait()、notify()、notifyAll()用法obj.wait()/obj.wait(long timeout)是Object中的方法&#xff0c;当线程调用wait()方法&#xff0c;当前线程释放对象锁&#xff0c;进入等待队列。obj.notify()/obj.nogifyAll()是Object中的方法&#xff0c;唤醒在此对象上wait()的单个…

怎么找到项目中所有同名的类_26岁转行程序员的成长历程--Day03从内存层面理解类和对象...

今天学习了类、对象及相关知识&#xff0c;试着从内存角度分析三者关系&#xff0c;如果有不对的地方请指正首先得先介绍java中的三个内存区域&#xff1a;栈区用于存放该线程执行方法的信息&#xff08;实际参数、局部变量等&#xff09;。栈属于线程私有&#xff0c;不能实现…

pycharm提示your evalluation license has expired解决方法

安装pycharm&#xff0c;一段时间后提示your evalluation license has expired&#xff1a;打开pycharm--点击help--register--选中license server,输入license server address如图示即可 转载于:https://www.cnblogs.com/youtiaoge/p/7125070.html

【SPSS统计分析】SPSS聚类分析:一个案例演示聚类分析全过程(附SPSS 19.0中文版下载)

摘要:案例数据源: 有20种12盎司啤酒成分和价格的数据,变量包括啤酒名称、热量、钠含量、酒精含量、价格。数据来自《SPSS for Windows 统计分析》。 目 录 问题一:选择那些变量进行聚类?——采用“R型聚类

python利用特征进行可视化样本显示_利用Python进行机器学习之特征选择

毫无疑问&#xff0c;解决一个问题最重要的是恰当选取特征、甚至创造特征的能力&#xff0c;这叫做特征选取和特征工程。对于特征选取工作&#xff0c;我个人认为分为两个方面&#xff1a;1)利用python中已有的算法进行特征选取。2)人为分析各个变量特征与目标值之间的关系&…

甘肃2019年9月计算机二级报名入口,2019年9月甘肃计算机二级考试成绩查询入口...

【摘要】2019年9月份计算机二级考试已经圆满结束&#xff0c;参加考试的小伙伴们已经迫不及待的想要知道成绩了吧&#xff0c;小编对2019年9月甘肃计算机二级考试成绩查询入口进行了整理&#xff0c;参加9月份考试的朋友们到时候记得按时查询成绩哦&#xff01;想要了解更多计算…

FluentEmail - 适用于 .NET 和 .NET Core 的邮件发送库

简介FluentEmail - 适用于 .NET 和 .NET Core 的邮件发送库从 .NET 和 .NET Core 发送电子邮件的最简单方法。将 Razor 用于电子邮件模板并使用 SendGrid、MailGun、SMTP 等进行发送Nuget包•FluentEmail.Core - 域模型•FluentEmail.Smtp - 通过 SMTP 服务器发送电子邮件•Flu…

安装MySql出现Error Nr.1045的解决办法

如图&#xff0c;最后一步出现这个错误框 这是因为上次安装过MySql&#xff0c;其用户数据在卸载的时候没有被删除掉&#xff0c;解决办法如下&#xff1a; 显示隐藏的文件夹&#xff0c;打开C盘&#xff0c;找到下图文件删除之 删除之后再安装一遍MySQL&#xff0c;就可以了转…

python网易云_用python爬虫爬取网易云音乐

标签&#xff1a; 使用python爬虫爬取网易云音乐 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页版找一下你想要听的歌曲点击进去。按键盘F12打开网页调试工具,点击Network就可以查看网络请求的相关信息&#xff0c;选择XHR&#xff0c;然后可以看…

android 固定底部 布局_Android系统列表控件

在android系统控件中&#xff0c;有多个控件可以展示列表数据。一、ListView该组件是android中最常用的一个UI组件&#xff0c;用于实现在屏幕上显示多个内容&#xff0c;以便于我们用手指进行滑动。ListView控件以列表的形式展示具体内容&#xff0c;并且能够根据数据的长度自…

.NetCore中IdentityServer使用nginx-proxy的一次排错经历

前言最近在看 Duende.IdentityServer.Admin&#xff0c;本地使用IIS Express跑了一下源码&#xff0c;也看了一遍的代码&#xff0c;决定使用他们的模板创建一个Demo&#xff0c;部署在本地的Docker环境中&#xff0c;也算是踩一下坑吧。以下不会详细介绍项目的部署&#xff0c…

nmap脚本使用总结

原文链接&#xff1a;http://drops.wooyun.org/tips/2188 0x00 前言&#xff1a; nmap的基本介绍和基本使用方法&#xff0c;在乌云知识库中已经有人提交过&#xff0c;讲的比较详细&#xff0c;在此文中就不再讲述。 具体链接&#xff1a;http://drops.wooyun.org/tips/2002 本…

身份管理软件公司Okta计划IPO,目标融资1亿美元

Okta是一家专门提供身份管理和单点登陆&#xff08;SSO&#xff09;软件的公司。今日公司提交了一份S-1表格正式启动了IPO程序。根据文件内容显示&#xff0c;Okta计划在首次公开募股中融资1亿美元。 公司表示&#xff0c;Okta将在纳斯达克上市&#xff0c;股票代码为OKTA。 即…

jmeter对乱码如何处理_JMeter读取 Excel 表中用例数据实现接口压测

传统的接口测试&#xff0c;都是在接口中手动输入不同用例准备的多种场景参数数据&#xff0c;一遍一遍的输入来执行多个不同的用例&#xff0c;但是现在利用excel表格准备各种类型的数据&#xff0c;使用Jmeter中Jmeter CSV Data Set Config参数化实现可设置的、一次性的读取e…

C# 利用.NET 升级助手将.NET Framework项目升级为.NET 6

概述.NET6 正式版本已经发布有一阵子了&#xff0c;今天我就体验一下如何将.NET Framework的项目升级为.NET 6.升级条件&#xff1a;Windows 操作系统.NET 6 SDKVisual Studio 2022 17.0 或更高版本环境准备①首先是VS2022下载&#xff0c;直接上微软官方网站&#xff0c;下载地…