个人公众号 yk 坤帝
获取更多学习资料
之前我们讨论了一下请求和响应,接下来几天我们都会讨论对数据的处理。
接触了爬虫这个领域,大家肯定都听过正则表达式的鼎鼎大名,不过今天我们暂时不谈正则,我们先来讨论一下数据的简单处理,为之后的正则表达式做准备。
我们用requests.get或requests.post获取到网页的源码,通过BeautifulSoup解析之后,得到的数据还是可能千奇百怪的,可能多了空格,可能有些内容我们不需要等等,所以我们应该对这些数据进行简单的处理。
首先,来看第一种情况,首尾很多空格的情况,下图是豆瓣电影Top250的图,如果我们想要获取电影上映年份/上映地点/电影类别,实际通过BeautifulSoup解析获取到的数据并不是我们想要的结果。
movie = ''' 1994 / 美国 / 犯罪 剧情 '''
# 我们实际能获取到的数据是这样的,现在我们要去掉首尾多余的空格,可以这么做 movie = movie.strip()
# strip()表示去除首尾的空格,这个对字符串的处理用得非常多
# 得到的结果就是1994 / 美国 / 犯罪 剧情
经过strip()处理之后,可以看到得到得结果中仍然还是有空格,这个就可以用replace来替 换掉空格。
个人公众号 yk 坤帝
获取更多学习资料
movie = ''' 1994 / 美国 / 犯罪 剧情 '''
movie = movie.strip() #
得到的结果就是1994 / 美国 / 犯罪 剧情
movie = movie.replace(' ', '')
# 这一行表示将字符串中的空格替换掉,replace第一个参数表示要替换的字符串,第二个 参数表示要用什么来替换。
# 得到的结果就是1994/美国/犯罪剧情
经过replace()处理之后,其实得到的数据已经可以了,但是,如果我们想分别提取出上映 年份/上映地点/电影分类呢。
这个时候就用到我们之前用过的split了。
movie = ''' 1994 / 美国 / 犯罪 剧情 '''
movie = movie.strip()
# 得到得结果就是1994 / 美国 / 犯罪 剧情 movie = movie.replace(' ', '')
# 得到的结果就是1994/美国/犯罪剧情 movie = movie.split('/')
# 这一行表示将字符串通过/进行分割,得到的是一个列表
# 得到的结果是['1994', '美国', '犯罪剧情']
通过strip和replace和split就能得到我们想要的结果了,这三种字符串的处理方法会在处理 数据中经常使用。
然后我们来看下第二种情况,是关于URL拼接问题的,假设我们现在要爬取知乎首页的超链 接,然后顺着爬取到的超链接一直深入爬下去,这样就能爬取整个知乎了。
下图是知乎首页其中一个问题的URL,可以发现这个URL并不完整,需要拼接上当前的域名 才能构成一个完整的URL。
我们当然可以用https://www.zhihu.com和这个URL拼接起来,但是这样又有一个问题,我 们是想要获取到知乎的所有URL,有的URL是带了https://www.zhihu.com的,这样再拼接 一下,就容易出错,所以我们需要预先处理一下。这就需要用到startswith方法了。
个人公众号 yk 坤帝
获取更多学习资料
origin_url = 'https://www.zhihu.com'
url_list = ['/question/36539555/answer/595275293', '/question/308663552/a nswer/577063117', 'https://www.zhihu.com/special/20743868']
for i in range(len(url_list)):
if not url_list[i].startswith('http'):
# 这一行表示如果url_list[i]不是以http开头的话,那么就执行if内部的语句
url_list[i] = origin_url + url_list[i]
print(url_list)
# 得到的最终结果是['https://www.zhihu.com/question/36539555/answer/5952752 93', 'https://www.zhihu.com/question/308663552/answer/577063117', 'https:// www.zhihu.com/special/20743868']
通过startswith提前判断一下,就能够得到我们想要的结果了。当然有startswith,自然而 然会有endswith,同样举个例子来看。
个人公众号 yk 坤帝
获取更多学习资料
url_list = ['https://pic2.zhimg.com/50/v25502c54842dceeb2e8901e884407a7fd_fhd.jpg', 'https://www.zhihu.com/special/20743868']
for url in url_list:
if url.endswith('jpg'):
# 这一行表示如果url是以jpg结尾的话,就执行if内部的语句
url_list.remove(url) 6 print(url_list)
# 最终结果是['https://www.zhihu.com/special/20743868']
通过startswith和endswith可以用来过滤我们不想要的字符串,并对其进行操作。
最后,我们再来谈一个join方法,这个方法是用来拼接一个序列(列表/元组等)的值的, 将一个序列转换一个字符串。
下图是豆瓣中一本书的详情页,每本书都有他的标签,有的时候为了方便存储,我们需要将 这些标签连起来组成一个字符串,我们就可以用join来操作了。
# 上图我们用爬虫去爬取书籍的标签的话,得到的是tag这样的一个列表
tag = ['文学', '短篇小说', '小说', '先锋文学']
tag = '-'.join(tag)
# 这一行表示用'-'符号将tag这个列表中的每个值连接起来,得到的是一个字符串
# 最终结果是'文学-短篇小说-小说-先锋文学'
好了,今天的分享本来就到这里结束了,但还是忍不住要插一个列表的去重,因为真的经常 会用到。
有这样一个需求,一本书总共有600000个英文单词,保存在了一个列表中,现在想要统计 如果想要阅读这本书,需要多少得词汇量,那么我们面对得问题就是去重。
我们直接看代码:
个人公众号 yk 坤帝
获取更多学习资料
# 实现功能:将列表中相同的元素去重,统计书籍词汇量
content = ['Whatever', 'is', 'worth', 'doing',
'is', 'worth', 'doing', 'well']
new_content = set(content)
# 这一步是将列表转换成集合,就去重成功了,因为集合内的元素是不能重复的,但它是无 序的
new_content = list(new_content)
# 这一步是将上一步得到的集合转换成一个列表,这样就得到了最终结果列表了 print(new_content)
# 得到的结果是['worth', 'Whatever', 'is', 'doing', 'well']
print(len(new_content))
# 得到的结果是5,说明这本书的词汇量是5个
至此,我们总共讨论了字符串的6种常用方法,分别是strip、replace、split、startswith、 endswith、join,以及列表的去重。 明天我们开始来讨论正则表达式,大家加油。
个人公众号 yk 坤帝
获取更多学习资料
**
第0关 认识爬虫
**
1、初始爬虫
爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。
2、明晰路径
2-1、浏览器工作原理
(1)解析数据:当服务器把数据响应给浏览器之后,浏览器并不会直接把数据丢给我们。因为这些数据是用计算机的语言写的,浏览器还要把这些数据翻译成我们能看得懂的内容;
(2)提取数据:我们就可以在拿到的数据中,挑选出对我们有用的数据;
(3)存储数据:将挑选出来的有用数据保存在某一文件/数据库中。
2-2、爬虫工作原理
(1)获取数据:爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据;
(2)解析数据:爬虫程序会把服务器返回的数据解析成我们能读懂的格式;
(3)提取数据:爬虫程序再从中提取出我们需要的数据;
(4)储存数据:爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。
3、体验爬虫
3-1、requests.get()
①、安装 requests 库
Mac电脑里打开终端软件(terminal),输入pip3 install requests,然后点击 enter;
Windows电脑里叫命令提示符(cmd),输入pip install requests 。
提示:往后安装其他库时与上方类似,pip install 模块名
②、requests 库作用
requests 库可以帮我们下载网页源代码、文本、图片,甚至是音频。其实,“下载”本质上是向服务器发送请求并得到响应。
③、requests 库使用
选择语言
res = requests.get(‘URL’)
requests.get 是在调用requests库中的get()方法,它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后服务器对请求作出了响应。我们把这个响应返回的结果赋值在变量res上。
3-2、Response对象的常用属性
①、response.status_code
打印 response 的响应状态码,以检查请求是否成功。
②、response.content
把 Response 对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载。
③、response.text
把 Response 对象的内容以字符串的形式返回,适用于文字、网页源代码的下载。
④、response.encoding
能帮我们定义Response对象的编码。(遇上文本的乱码问题,才考虑用res.encoding)
3-3、汇总图解
4、爬虫伦理
4-1、Robots 协议
Robots 协议是互联网爬虫的一项公认的道德规范,它的全称是“网络爬虫排除标准”(Robots exclusion protocol),这个协议用来告诉爬虫,哪些页面是可以抓取的,哪些不可以。
4-2、协议查看
(1)在网站的域名后加上/robots.txt就可以了。如淘宝的robots协议 ( http://www.taobao.com/robots.txt);
(2)协议里最常出现的英文是Allow和Disallow,Allow代表可以被访问,Disallow代表禁止被访问。
目录
1、初始爬虫
2、明晰路径
2-1、浏览器工作原理
2-2、爬虫工作原理
3、体验爬虫
3-1、requests.get()
3-2、Response对象的常用属性
3-3、汇总图解
4、爬虫伦理
4-1、Robots 协议
4-2、协议查看
程中我们的示范,会用谷歌浏览器(Chrome)进行演示,强烈推荐你也使用它。
如果你还没有谷歌浏览器(Chrome),打开下面的链接,就可以下载Chrome的安装包了,Windows和Mac都有:谷歌浏览器(Chrome)安装教程(https://www.google.cn/intl/zh-CN/chrome/)
初识爬虫
什么是爬虫?
到底什么是爬虫呢?
爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。
爬虫能做很多事,能做商业分析,也能做生活助手,比如:分析北京近两年二手房成交均价是多少?深圳的Python工程师平均薪资是多少?北京哪家餐厅粤菜最好吃?等等。
这是个人利用爬虫所做到的事情,而公司,同样可以利用爬虫来实现巨大的商业价值。比如你所熟悉的搜索引擎——百度和谷歌,它们的核心技术之一也是爬虫,而且是超级爬虫。
以百度为例,你在搜索的时候仔细看,会发现每个搜索结果下面都有一个百度快照。
点击百度快照,你会发现网址的开头有baidu这个词,也就是说这个网页属于百度。
这是因为,百度这家公司会源源不断地把千千万万个网站爬取下来,存储在自己的服务器上。你在百度搜索的本质就是在它的服务器上搜索信息,你搜索到的结果是一些超链接,在超链接跳转之后你就可以访问其它网站了。
爬虫还让这些搜索巨头有机会朝着人工智能的未来迈进,因为人工智能的发展离不开海量的数据。而每天使用这些搜索网站的用户都是数以亿计的,产生的数据自然也是难以计量的。
从搜索巨头到人工智能巨头,这是一条波澜壮阔的路。而我们应该看到,事情的源头,却是我们今日所书写的“爬虫”。
我们会通过一个网站:人人都是蜘蛛侠 来学习浏览器的工作原理。(这是我们自己搭建的网站,方便教学和实操)
首先,我们在浏览器的地址栏输入网址(也可以叫URL)。然后,浏览器向服务器传达了我们想访问某个网页的需求,这个过程就叫做【请求】。
紧接着,服务器把你想要的网站数据发送给浏览器,这个过程叫做【响应】。
所以浏览器和服务器之间,先请求,后响应,有这么一层关系。
爬虫的工作原理
爬虫学习大纲
第0关,初识爬虫,你会了解爬虫的工作原理,写出一个简单的爬虫程序,学会爬虫的第0步:获取数据。
icon
第1关,你将会快速入门HTML基础知识,达到读懂和修改HTML文档的水平。有了这些基础,你才能去学习如何解析数据和提取数据。
icon
第2、3、4、5关,我会教你爬虫的第1和第2步:解析数据和提取数据。同时,你还会学到两种不同的发起请求的方式。
icon
在第6关,你将学会存储数据,即把目标数据写入到本地的Excel表格中。到此,你就学会了爬虫完整的四个步骤,掌握了最基本的爬虫技能啦。
icon
第7关,我们一起做一个项目,爬取一个知乎大v的所有文章,并且存到Excel中。以此,我们巩固和复习了0-6关的所有知识。第7关会是一个分水岭,后面关卡的进阶知识都建立在前7关的基础上。
icon
第8关,学会cookies,就可以让浏览器记住你,你们可以更方便地长期保持联系,而不是在一次见面之后就相忘于江湖。
icon
第9关,学习控制浏览器,来应对爬虫中一些更复杂的情况。第10关,你的爬虫会变得更自动化,爬虫程序不但可以定时工作,还可以把爬取结果传递给你。
icon
接下来的4关,你将学会更高效更强大的爬虫方法,让爬虫技能升级。
icon
第15关毕业总结,就到了告别的时刻了。这时你也学成出师,可以用爬虫知识去做自己想做的事情了,让爬虫为你消灭重复劳动,高效获取信息,创造出更多价值。
icon
以上,就是爬虫学习大纲。
# 引入requests库
import requests
# requests.get是在调用requests库中的get()方法,它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后服务器对请求作出了响应。
# 我们把这个响应返回的结果赋值给变量res
res = requests.get('URL')
现在,我们试着用requests.get()来下载一个小说——《三国演义》:
# 来吧,写代码吧
import requests
url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md'
response = requests.get(url)
个人公众号 yk 坤帝
后台回复 scrapy 获取整理资源
import requests
res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')
# 打印变量res的响应状态码,以检查请求是否成功
print(res.status_code)
icon
第5行代码是在打印res的响应状态码,它可以用来检查我们的requests请求是否得到了成功的响应。我们看到终端结果显示了200,这个数字代表服务器同意了请求,并返回了数据给我们。
icon
除了200,我们还可能收到其他的状态码。下面有一个表格,供你参考不同的状态码代表什么,但不需要记住它们,在遇到问题的时候查询就好。
icon
response.status_code是一个很常用的属性,在我们之后的爬虫代码中也将多次出现。
icon
接着的属性是response.content,它能把Response对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载,看个例子你就懂了。
icon
假如我们想下载这张图片,它的URL是:https://res.pandateacher.com/2018-12-18-10-43-07.png
# 引入requests库
import requests
# 发出请求,并把返回的结果放在变量res中
res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')
# 把Reponse对象的内容以二进制数据的形式返回
pic = res.content
# 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。
# 图片内容需要以二进制wb读写。你在学习open()函数时接触过它。
photo = open('ppt.jpg','wb')
# 获取pic的二进制内容
photo.write(pic)
# 关闭文件
photo.close()
icon
这样,我们的图片就下载成功啦~你也可以在本地运行这个程序。
icon
讲完了response.content,继续看response.text,这个属性可以把Response对象的内容以字符串的形式返回,适用于文字、网页源代码的下载。
icon
举个例子,我们还是来下载小说《三国演义》的第一回。
# 引用requests库
import requests
# 下载《三国演义》第一回,我们得到一个对象,它被命名为res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
# 把Response对象的内容以字符串的形式返回
novel=res.text
# 现在,可以打印小说了,但考虑到整章太长,只输出800字看看就好。在关于列表的知识那里,你学过[:800]的用法。
print(novel[:800])
icon
之后,我们就可以用通过读写文件把小说保存到本地了。这是Python基础语法知识,你应该已经学会了。下面直接给出做法,你也可以在自己的本地电脑上做尝试练习。
# 引入requests库
import requests
#下载《三国演义》第一回,我们得到一个对象,它被命名为res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
# 把Response对象的内容以字符串的形式返回
novel = res.text
# 创建一个名为《三国演义》的txt文档,指针放在文件末尾,追加内容
k = open('《三国演义》.txt','a+')
# 写进文件中
k.write(novel)
# 关闭文档
k.close()
爬虫伦理
icon
就像是两个人在来来往往的相处中,会考虑对方的感受;在互联网的世界中,我们也要考虑一下服务器对爬虫的感受是怎样的。
icon
我们说过,服务器其实就是一个超级电脑,拥有这个服务器的公司,对爬虫其实也有明确的态度。
icon
通常情况下,服务器不太会在意小爬虫,但是,服务器会拒绝频率很高的大型爬虫和恶意爬虫,因为这会给服务器带来极大的压力或伤害。
icon
不过,服务器在通常情况下,对搜索引擎是欢迎的态度(刚刚讲过,谷歌和百度的核心技术之一就是爬虫)。当然,这是有条件的,通常这些条件会写在robots协议里。
icon
robots协议是互联网爬虫的一项公认的道德规范,它的全称是“网络爬虫排除标准”(robots exclusion protocol),这个协议用来告诉爬虫,哪些页面是可以抓取的,哪些不可以。
icon
我们使用robots协议的场景通常是:看到想获取的内容后,检查一下网站是否允许爬取。因此我们只需要能找到、简单读懂robots协议就足够了。
icon
我们截取了一部分淘宝的robots协议,可以看到淘宝对百度和谷歌这两个爬虫的访问规定,以及对其它爬虫的规定。
icon
有的同学可能就要问了:“域名是什么?域名和URL(网址)有什么关系?”很敏锐哟!
icon
我们前面说过,如果把一个网页类比为一幢房子,URL指示了网页的地址,就像房子在地球上的详细到某某街道某某号的具体地址,那么域名就像房子所在的国家,指示了网站的地址。
icon
如果我们看到一个网页,想爬上面的内容,怎么找到它的URL我们刚刚学过了,如果网页的URL是https://pypi.org/project/requests/,那么,此网站的域名是pypi.org;如果网页的URL是http://cn.python-requests.org/zh_CN/latest/,那么网站的域名是cn.python-requests.org。
icon
我们再来看一个,如果网页的URL是https://www.taobao.com/markets/3c/tbdc?spm=a21bo.2017.201867-main.11.5af911d9VV8EyS,那么网站的域名是www.taobao.com。
单选题
看懂了么?我们来试一次,某网页的网址是https://www.bilibili.com/v/douga/?spm_id_from=333.851.b_7072696d6172794368616e6e656c4d656e75.1,那么网站的域名是?
答对了!
icon
没错,你已经找到了规律!
icon
有个课后思考交给你:域名中会藏着网站的国籍或功能领域等信息,那么.cn,.com,.gov结尾的域名分别代表了什么?
icon
来看一个实例:我们截取了一部分淘宝的robots协议 (
http://www.taobao.com/robots.txt)。在截取的部分,可以看到淘宝对百度和谷歌这两个爬虫的访问规定,以及对其它爬虫的规定。
User-agent: Baiduspider # 百度爬虫
Allow: /article # 允许访问 article
Allow: /oshtml # 允许访问 oshtml
Allow: /ershou # 允许访问 ershou
Allow: /$ # 允许访问根目录,即淘宝主页
Disallow: /product/ # 禁止访问product文件夹下面的所有文件,但是product文件夹本身允许被访问
Disallow: / # 禁止访问除 Allow 规定页面之外的其他所有页面
User-Agent: Googlebot # 谷歌爬虫
Allow: /article
Allow: /oshtml
Allow: /product # 允许访问product文件夹及product文件夹下面的所有文件
Allow: /spu
Allow: /dianpu
Allow: /oversea
Allow: /list
Allow: /ershou
Allow: /$
Disallow: / # 禁止访问除 Allow 规定页面之外的其他所有页面
…… # 文件太长,省略了对其它爬虫的规定,想看全文的话,点击上面的链接
User-Agent: * # 其他爬虫
Disallow: / # 禁止访问所有页面
icon
可以看出robots协议是“分段”的吗?每个段落都含有以下两种字段:一种是User-agent:,另一种是Allow:或Disallow:。
icon
User-agent表示的是爬虫类型,上面的示例代码注释了“百度爬虫”和“谷歌爬虫”,我们自己写的爬虫一般要看User-Agent: *,*指向所有未被明确提及的爬虫。
icon
Allow代表允许被访问,Disallow代表禁止被访问。字段对应的值都含有路径分隔符/,限制了哪些或哪一层目录的内容是允许或者禁止被访问的。可以对比上述百度爬虫Disallow: /product/和谷歌爬虫Allow: /product的注释行理解一下。
练习介绍
要求:
获取文章《HTTP状态响应码》全部内容,并且打印出全文内容。
目的:
练习获取网上的文本文件。
题目要求:获取文章《HTTP状态响应码》全部内容,并且打印出全文内容。
获取数据:
文本URL:
https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/HTTP%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.md
首先调用requests库,使用requests.get(‘URL’)获取文件,返回的是Response对象。
然后需要把Response对象用合适的数据形式返回。
存储数据:
存储文件的三个步骤:打开文件,存储文件,关闭文件。
import requests
destnation_url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/HTTP%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.md'
res = requests.get (destnation_url)
print(res.status_code) # 查看响应码
article=res.text # 把Response对象的内容以字符串的形式返回
print(article)
返回结果如下
# HTTP响应状态码
## 1xx:临时响应
#### 表示临时响应并需要请求者继续执行操作的状态代码。
100 **继续**请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 **切换协议**请求者已要求服务器切换协议,服务器已确认并准备切换。
---
## 2xx : 成功
#### 表示成功处理了请求的状态代码。
200 **成功** 服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
201 **已创建** 请求成功并且服务器创建了新的资源。
202 **已接受** 服务器已接受请求,但尚未处理。
203 **非授权信息** 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 **无内容** 服务器成功处理了请求,但没有返回任何内容。
205 **重置内容**服务器成功处理了请求,但没有返回 任何内容。
206 **部分内容** 服å¡器成功处理了部分 GET 请求。
---
## 3xx : 重定向
#### 表示要完成请求,需要进一步操作。通常,以下状态代码用来重定向。
300 **多种选择** 针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 **永久移动** 请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 **临时移动** 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 **查看其他位置**请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 **未修改**自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
305 **使用代理**请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。
307 **临时重定向** 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
---
## 4xx:请求错误
### 以下状态代码表示请求可能出错,妨碍了服务器的处理。
400 **错误请求**服务器不理解请求的语法。
401 **未授权**请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。
403 **禁止**服务器拒绝请求。
404 **未找到**服务器找不到请求的网页。
405 **方法禁用**禁用请求中指定的方法。
406 **不接受**无法使用请求的内容特性响应请求的网页。
407 **需要代理授权**此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408 **请求超时** 服务器等候请求时发生超时。
409 **冲突** 服务器在完成请求时发生冲突。服务器必须在响应中包含有关å²突的信息。
410 **已删除** 如果请求的资源已永久删除,服务器就会返回此响应。
411 **需要有效长度**服务器不接受不含有效内容长度标头字段的请求。
412 **未满足前提条件**服务器未满足请求者在请求中设置的其中一个前提条件。
413 **请求实体过大**服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 **请求的 URI 过长**请求的 URI(通常为网址)过长,服务器无法处理。
415 **不支持的媒体类型**请求的格式不受请求页面的支持。
416 **请求范围不符合要求**如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 **未满足期望值**服务器未满足"期望"请求标头字段的要求。
---
## 5xx:服务器错误
### 以下状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
500 **服务器内部错误** 服务器遇到错误,无法完成请求。
501 **尚未实施**服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
502 **错误网关**服务器作为网关或代理,从上游服务器收到无效响应。
503 **服务不可用**服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
504 **网关超时** 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 **HTTP 版本不受支持**服务器不支持请求中所用的 HTTP 协议版本。
个人公众号 yk 坤帝
后台回复 scrapy 获取整理资源
练习介绍
要求:
获取下面的图片,并且储存图片。
目的:
练习获取网上的图片文件。
个人公众号 yk 坤帝
后台回复 scrapy 获取整理资源
import requests
# 发出请求,并把返回的结果放在变量res中
res = requests.get('https://res.pandateacher.com/2019-01-12-15-29-33.png')
# 把Reponse对象的内容以二进制数据的形式返回
pic=res.content
# 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。
# 图片内容需要以二进制wb读写。你在学习open()函数时接触过它。
photo = open('spider.jpg','wb')
# 获取pic的二进制内容
photo.write(pic)
# 关闭文件
photo.close()
练习介绍
题目要求:
获取下面的音乐,并且储存它,然后请刷新页面,这样你就可以在【文件】内看到它。音乐URL:
https://static.pandateacher.com/Over%20The%20Rainbow.mp3
获取数据
音乐URL:https://static.pandateacher.com/Over%20The%20Rainbow.mp3
首先调用requests库,使用requests.get(‘URL’)获取文件,返回的是Response对象。
然后需要把Response对象用合适的数据形式返回。
存储文件
存储文件的三个步骤:打开文件,存储文件,关闭文件。
import requests
# 发出请求,并把返回的结果放在变量res中
res = requests.get('https://static.pandateacher.com/Over%20The%20Rainbow.mp3')
# 把Reponse对象的内容以二进制数据的形式返回
mp3 = res.content
# 新建了一个文件rainbow.mp3,这里的文件没加路径,它会被保存在程序运行的当前目录下。
# 音频内容需要以二进制wb读写。你在学习open()函数时接触过它。
music = open('rainbow.mp3','wb')
# 写入mp3的二进制内容
music.write(mp3)
# 关闭文件
music.close()
1.python第三方模块下载
Windows:
windows系统
进入命令行窗口 win+r
1.pip install 模块 国外镜像源 下载速度慢
2.pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 模块 国内清华镜像源 下载速度快
3.http://pypi.douban.com/simple/ 模块 国内豆瓣镜像源 下载速度快
4.https://pypi.mirrors.ustc.edu.cn/simple/ 模块 阿里云
5.https://pypi.tuna.tsinghua.edu.cn/simple/ 中科大
如果你那儿的网络总是不给力,又不想每次手动添加,可以加在配置文件里一劳永逸。
2.scrapy框架爬虫
1.定位到相应文件夹 Windows: windows系统 进入命令行窗口 win+r
2.scrapy startproject 项目
3.scrapy genspider 名称 www.xxx.com
基于CrawlSpider爬虫父类的创建
scrapy genspider -t crawl 名称 www.xxx.com
分布式爬虫:
执行工程 scrapy runspider xxx.py
3.python使用matplotlib模块绘制折线图相关参数
4.numpy读取本地数据
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
5.lambda函数用法
个人公众号 yk 坤帝
学习更多硬核知识。
f = open('命运1.txt','r')
txt = f.read()
d = {}
for i in txt:
if i not in ',。?!—《》:‘’“”()□':
d[i] = d.get(i,0) + 1
ls = list(d.items())
ls.sort(key=lambda x:x[1],reverse = True)
print("{}:{}".format(ls[0][0],ls[0][1]))
f.close()
命运1.txt文件在我的资源中下载
6. list,sort,lambda模块区别联系
list.sort(key=lambda x:x[1],reverse = True)
首先说一下 sort函数
sort函数是一个专门对列表进行排序的一个函数,下面是官方的解释
我的理解是,按照列表维度(指数组中第0,1,2个元素)进行排序,默认为从小到大,'reverse=True’则意味着从大到小。
关于维度,形象地理解如下:
list = [('i','he',5), ('q', 'I', 3), ('p', 'they', 1)]
中,
x:x[0]中,
x表示列表中的元素,
x[0]表示列表中的元素的索引为0的元素
key=lambda x:x[0]
相当于对’i’, ‘q’, 'p’进行排序,
其中x可以换成其他变量。x:x[1]***
那这个key=lambda x: x[1] 是什么意思呢? 其实可以把lambda看作一个隐函数,在这里可以不用管它,记得有这个就可以,
后面的x: x[1] 为对前面的对象中的第二维数据(即value)的值进行排序。
7.爬虫requests模块解析
# 调用requests模块
个人公众号 yk 坤帝
后台回复 面试项目整理 获取整理资源
import requests
# 获取网页源代码,得到的res是response对象。
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
# 检测请求是否正确响应
print(res.status_code)
res.encoding=res.apparent_encoding
# 正确响应,进行读写操作
# 新建一个名为book的html文档,你看到这里的文件没加路径,它会被保存在程序运行的当前目录下。
# 字符串需要以w读写。你在学习open()函数时接触过它。
if res.status_code == 200:
file = open('book1.html','wb')
# res.text是字符串格式,把它写入文件内。
file.write(res.content)
# 关闭文件
file.close()
8.爬虫bs4,BeautifulSoup解析
from bs4 import BeautifulSoup
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spder-men0.0.html')
print(res.status_code)
soup = BeautifulSoup(res.content,'html.parser')
#soup输出的内容于text一样,但格式不一样
#(soup)
item = soup.find('div')
#print(type(item))
#print(item)
items = soup.find_all('div')
#print(items)
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
soup = BeautifulSoup(res.text,'html.parser')
items = soup.find_all('div',class_='books')
#print(items)
#print(type(items))
for item in items:
#print('想找的数据都包含在这里了:\n',item)
#print(type(item))
kind = item.find('h2')
title = item.find(class_='title')
bref = item.find(class_='info')
print(kind.text,'\n',title.text,'\n',title['href'],'\n',bref.text)
print(type(kind),type(title),type(bref))
9.模拟器打开开发者模式
模拟器打开开发者模式
appium连接模拟器进行自动化测试时,需要使用adb来连接模拟器,具体操作步骤:
打开模拟器
在cmd中输入:adb devices
此时出现的列表中找不到对应的安卓设备
在cmd中输入:adb connect 127.0.0.1:5555(5555为模拟器对应的端口号,此处为雷电模拟器)
再次输入:adb devices,列表中找到对应模拟器表面连接成功
下面是其他几款流行的模拟器单位端口:
adb 命令连接模拟器
天天模拟器端口 6555
adb connect 127.0.0.1:6555
海马模拟器
adb connect 127.0.0.1:26944
mumu模拟器 6.0
adb connect 127.0.0.1:7555
逍遥游模拟器
adb connect 127.0.0.1:21503
夜神模拟器
adb connect 127.0.0.1:62001
10. d.get()用法解析
d[i] = d.get(i,0)+1
f = open('命运.txt','r')
txt = f.read()
d = {}
for i in txt:
if i not in '\n':
d[i] = d.get(i,0)+1
ls = list(d.items())
ls.sort(key=lambda x:x[1], reverse=True) # 此行可以按照词频由高到低排序
for k in range(10):
print(ls[k][0],end = '')
f.close()
d[i] = d.get(i,0)+1
d[i]代表字典d中符号i对应的键值
d.get()有两个参数时,理解为当i对应键值不存在时返回第二个参数作为键值,在本例中代表当i键值不存在时,返回0为i的键值,加1代表每次遍历到i键值加一,第二次遍历到i时,d.get(i,0)返回1,以此类推。
第三次遍历到i时,d.get(i,0)返回2,对应字典中i的键值
11.jieba模块用法
import jieba
s = input("请输入一个字符串")
n = len(s)
m = len(jieba.lcut(s))
print("中文字符数为{},中文词语数为{}。".format(n, m))