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,一经查实,立即删除!

相关文章

Visual Studio与C#编程十个实用技巧

如果你通过搜索引擎发现这篇文章的,我建议你先看看本系列的 第一篇 ,这是本系列文章的第二篇,今天为大家带来更丰富的C#和Visual Studio编程技巧,一起来看看吧。 1、DataTable.HasRows 它不属于任何框架,但通过扩展方法很容易模仿这样一个方法,它不会消除检查数据表对象…

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

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

【好程序员笔记分享】C语言之break和continue

ios培训------我的c语言笔记&#xff0c;期待与您交流! #include <stdio.h> /*break:1.使用场合1> switch语句&#xff1a;退出整个switch语句2> 循环结构&#xff1a;退出整个循环语句* while* do while* for2.注意点只对最近的循环结构有效 continue&#xff1a;…

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

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

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

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

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

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

FastDFS 安装

FastDFS&#xff08;centerOs&#xff09; 安装包:FastDFS_v5.07.tar libfastcommon-master.zip(是从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库) // https://github.com/happyfish100/libfastcommonfastdfs-nginx-module_v1.16.tar.gz // https://github.com/happyfish10…

Android之android.system.ErrnoException: open failed: ENOENT (No such file or directory)

1 问题 在sdcard目录下面创建了一个文件提示下面的错误 android.system.ErrnoException: open failed: ENOENT (No such file or directory) 2 分析 错误代码是如下 String path = Environment.getExternalStorageDirectory().getAbsolutePath();try {File dir = new File(p…

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…

计算机一级b和小高考,2021年小高考B是几分相关内容

《2021年小高考B是几分相关内容》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《2021年小高考B是几分相关内容(3页珍藏版)》请在人人文库网上搜索。1、小高考B是几分相关内容 小高考专指普通高中学业水平考试&#xff0c;因为与大学录取直接挂钩&#xff0c;所以被称…

Nginx配置文件详细说明(转)

在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #运行用户user www-data; #启动进程,通常设置成和cpu的数量相等worker_processes 1; #全局错误日志及PID文件error_log /var/log/nginx/error.log;pid /var/run/nginx.pid; #工作模式及连接数…

运营推广的一些方法

1、技术操作维度&#xff1a;ASO&#xff0c;SEO&#xff0c;ASO简单介绍&#xff1a;http://baike.baidu.com/subview/1368976/9766740.htmSEO学习&#xff1a;《SEO实战密码》https://book.douban.com/subject/5348144/ 《SEO艺术》https://book.douban.com/subject/1054613…

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()的单个…

10个C#编程和Visual Studio使用技巧

摘要:C#是一门伟大的编程语言,与C++和Java相比,它的语法更简单,相对来说更好入门。Visual Studio作为.Net平台上最重量级的IDE,也通过不断的更新为开发者带来更出色的开发体验。本文将介绍10个C#编程和Visual Studio IDE使用技巧。

AspNet Core 6.0 Json写默认首字母小写(camelCase)问题

最近在把旧项目迁移到.net core6.0时遇到了之前一样的问题&#xff1a;框架返回的json序列化时将原来的首字母大写的字段统统转成了首字母小写的小驼峰命名&#xff0c;导致原来写好的前端数据无法正确渲染。于是上网找了下取消该默认行为的方法&#xff0c;在Startup.cs中添加…

学习总结——Selenium元素定位

读一本好书&#xff0c;不能读读就算了&#xff0c;做一下总结&#xff0c;变成自己的&#xff0c;以备查阅。 1. driver.findElement(By.id(<element ID>)) ID是独一无二的&#xff0c;使用ID定位是最为推荐的方法。 但是&#xff1a;1.不是所有元素都会指定ID&…

open ssl里面的自定义get***函数失效

1 问题 在open ssl加载引起里面部分我自己写了一个get和set方法,然后我在其它地方调用使用了Info类型的声明 extern Info info; 先初始化info,然后 info->setA(&info, value); char value[100]; 但是我立马 info->getA(&info, value, sizeof(value)); LOGI(…

计算机在现代商业中的作用,现代商业中计算机web数据挖掘技术的应用

[摘 要] 随着科技水平的不断提高&#xff0c;各种高科技设备辅助互联网将数字化、信息化的方法和手段运用到了各行各业之中&#xff0c;尤其在现代商业中&#xff0c;国际化、全球化的市场规模使得信息的处理工作极为庞大&#xff0c;需要更多的依赖计算机技术来完成。Web数据挖…

八种状态增加测试用例状态的精确度

一般在工作中记录测试用例状态用到三种状态&#xff1a;通过&#xff08;Pass&#xff09;&#xff0c;失败&#xff08;Fail&#xff09;和排队等待中&#xff08;In Queue&#xff09;。但是我倾向与更准确地表示一个一般测试用例的生命周期&#xff0c;尽管你的测试的周期会…

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

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