11.7 延伸与讨论
1.延伸1.robot.txt
该协议用来告知搜索引擎,哪些页面能被抓取,哪些页面不能被抓取。常见的文件写法[1]有:
User-agent:* 这里的*代表所有的搜索引擎种类,*是一个通配符
Disallow:/admin/禁止爬寻admin目录下面的目录
Disallow:/require/禁止爬寻require目录下面的目录
Disallow:/ABC/禁止爬寻ABC目录下面的目录
Disallow:/cgi-bin/*.htm 禁止访问/cgi-bin/目录下的所有以“.htm”为后缀的URL(包含子目录)
Disallow:/*?* 禁止访问网站中所有包含问号 (?)的网址
Disallow:/.jpg$ 禁止抓取网页中所有的.jpg格式的图片
Disallow:/ab/adc.html 禁止爬取ab文件夹下面的adc.html文件
Allow:/cgi-bin/允许爬寻cgi-bin目录下面的目录
Allow:/tmp 允许爬寻tmp的整个目录
Allow:.htm$ 仅允许访问以“.htm”为后缀的URL。
Allow:.gif$ 允许抓取网页和gif格式图片
Sitemap:告诉爬虫这个页面是网站地图
2.延伸2.HTTP状态码
在访问一个网页时,浏览器将向网页所在服务器发出请求。在浏览器显示网页内容前,服务器会先返回一个包含HTTP状态码的信息头(server header),用以响应浏览器的请求。HTTP状态码的英文为HTTP Status Code。状态码以3位数字的形式出现,代表不同意义:
100—199用于指定客户端应相应的某些动作
200—299用于表示请求成功
300—399用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息
400—499用于指出客户端的错误
500—599用于支持服务器错误
具体状态码信息可以在百度百科中查看HTTP状态码进行查看
3.延伸3.ruquests.get()参数
get()方法除了URL这个必填参数外,还存在13个选填参数,以下是这些参数的功能:
params:字典或字节序列,作为参数增加到url中
data:字典、字节序列或文件对象,作为request的内容
json:json格式的数据,作为request的内容
headers:字典,HTTP定制头
cookies:字典或cookieJar,request中的cookie
auth:元组,支持HTTP认证功能
file:输入文件,字典类型
timeout:设定超时时长(s)
proxies:设定访问代理服务器,可增加登录认证
allow_redirects:True/False:默认为True,重定向开关
stream:True/False:默认为True,获取内容并下载开关
verify:True/False:默认为True,认证SSL证书开关
cert:本地SSL证书路径
4.衍生5.re(正则表达式)
正则表达式,又称规则表达式(regular expression,regex,re等),是一种字符串匹配描述的模式。通过正则表达式可以查找一个字符串中是否含有某种特定子串,以匹配的子串来替换或者取出符合条件的子串等。简单来看,正则表达式是用来简洁表达一组字符串的表达式。正则表达式的常用操作符如图11-17所示。
图11-17 正则表达式的常用操作符
以“python”为例,re的使用效果如下:
P(Y|YT|YTH|YTHO)?N ‘PN’、‘PYN’、‘PYTN’、‘PYTHN’、‘PYTHON’
PYTHON+‘PYTHON’、‘PYTHONN’、‘PYTHONNN’ …
PY[TH]ON ‘PYTON’、‘PYHON’
PY[^TH]?ON ‘PYON’、‘PYaON’、‘PYbON’、‘PYcON’…
PY{:3}N ‘PN’、‘PYN’、‘PYYN’、‘PYYYN’
6.延伸5.Python中循环的两种形式
计算机经常被用于执行一些重复性的任务。对计算机来说,执行相同或相似的任务而不出错是很简单的事。Python提供了一些功能语句,使这类任务变得更加简单。在正文中我们已经看到了通过for循环是如何实现遍历的。这里介绍另一种循环的实现——while循环,请看下面的示例:
n=10
while n>0 :
print (n)
n=n-1
print(‘条件不满足,循环停止’)
这段代码的阅读非常容易。其中print(n)和n=n-1这两句通过缩进成为while的循环体。当n>0时,显示n的值,然后对n减1。当n>0不成立时,结束while语句,并打印条件不满足提示句。通过观察可以得出while语句执行流程如下:
计算条件表达式的值,判断是True或False;
如果判断结果为True,执行while中的语句体,并返回while语句头进行下一次条件判断;
如果判断结果为False,结束while语句并执行下一条语句。
此类执行到第二步又返回到顶部的执行流程被称为循环。每执行一次循环体,被称为一次迭代。上面的循环,我们可以说它进行了十次迭代,表示循环体被执行了十次。循环体会改变一个或多个变量的值,因此当条件不满足时,循环结束。有一种变量在每次循环执行时其值都会变化,并控制循环什么时候结束,这种变量被称为迭代变量。如果没有迭代变量,循环就会永远执行下去,导致无限循环。
既然while循环是通过判断循环头中的表达式部分是否成立来控制循环执行与否的,那么当表达式判断始终为真时,就可以实现无限循环,保证表达式是常量就是一种方法。常见的无限循环写法为:
while True:
循环体
我们可以通过break语句和continue语句控制循环:
while True:
word=input(‘请输入单词,当输入done时程序结束’)
if word==‘done’:
break
print(word)
在这个无限循环中,用户每输入一个单词就将被输出,并返回输入提示,请求用户再次输入。当用户输入done时,if条件成立,触发break语句,程序在执行完break语句后直接跳出循环体,因此最后输入的done将不会被打印。
while True:
word=input(‘请输入单词,当输入done时程序结束’)
if word[0]==‘#’:
continue
if word==‘done’:
break
print(word)
我们稍微修改了上一段代码,加入了continue语句。if word[0]==‘#’表示除了#号开头的单词,其他所有的单词都将被打印出来。当continue语句被执行时,当前迭代结束但循环不停止,程序会从continue语句位置跳到while语句的开头执行下一轮循环。
6.实践:尝试抓取你所感兴趣的网页信息。在抓取过程中如果遇到超出我们所介绍内容的问题时,请认真阅读有关requests库中所提供的7种方法及其相关参数的使用,或通过相关网络社区进行提问并获得解决方法。
[1] https://baike.baidu.com/item/robots协议/2483797?fromtitle=robot.txt&fromid=3936191&fr=aladdin