Python网络爬虫与信息提取(二):网络爬虫之规则(Requests库 Robots规则)
在python中有两种方式可以发送http请求
①通过python自带的urllib模块,不需要安装,直接from urllib import request,直接使用request对象做Http请求的发送。
②通过第三方的requests模块,需要pip install安装(推荐,因为API人性化)
Requests设置请求头Headers
为什么要设置headers?
在请求网页爬取的时候,输出的text信息中会出现抱歉,无法访问等字眼,这就是禁止爬取,需要通过反爬机制去解决这个问题。
headers是解决requests请求反爬的方法之一,相当于我们进去这个网页的服务器本身,假装自己本身在爬取数据。对反爬虫网页,可以设置一些headers信息,模拟成浏览器取访问网站 。
headers在哪里找?
F12,network,docs,Requests Headers
Requests库的7个主要方法
Requests库的get()方法
获得一个网页最简单的一行代码就是 r = requests.get(url)
Requests库支持6种常用的连接异常
raise_for_status() 方法
response这样一个对象返回了所有的网页内容,它也提供了一个方法:raise_for_status(),这个方法是专门与异常打交道的,能判断返回的responce类型r,是不是200。是200就表示返回的内容是正确的;不是200就会产生一个HTTPError的异常
爬取网页的通用代码框架
import requests def getHTMLText(url): try: r = requests.get(url, timeout=30) r.raise_for_status() #如果状态不是200,引发HTTPError异常 r.encoding = r.apparent_encoding return r.text except: return '产生异常' if __name__ == '__main__': url = "http://www.baidu.com" print(getHTMLText(url))
HTTP协议对资源的操作
这六个方法就是requests库提供的6个主要函数所对应的功能HTTP协议通过这6个常用的方法对资源进行管理
Requests库主要方法解析(重点掌握head和get两个方法)
request方法
Requests的eequest方法是所有方法的基础方法
requests.request(method,url,**kwargs)
method(7个):请求方法,对应get/put/post等7种
url:拟获取页面的url链接
**kwargs(13个):控制访问的参数,共13个
前6种都介绍过,option是向服务器获取一些服务器和客户端能够打交道的参数,平时用的较少
------------------------------------------------------------
可以模拟任何我们想模拟的浏览器,向服务器发起访问。模拟浏览器的方法就是在headers字段中实现
cookies和auth字段都是requests库的高级字段
可以有效地隐藏用户爬取网页的源IP地址信息,能够有效地防止对爬虫的逆追踪
都对应了一些高级功能
get方法(所以方法中最常用的方法)
**kwargs和params与request方法一样
head方法
**kwargs与request方法一样
post方法
put方法
patch方法
delete方法
为什么这些方法的**kwargs会有不同呢?
在使用后6个方法的时候,由于这些方法会常用到某些访问控制参数,所以就把这些参数作为一个显式定义的参数量放到了函数的设计里面,而那些不很常用的参数就放到了访问控制可选的参数里面
网络爬虫的尺寸
网络爬虫带来的问题
骚扰问题
对于一个网站来讲,网络爬虫就像骚扰电话一样,可以对这个网站带来很致命的骚扰功能
网络爬虫的法律风险
服务器上的数据有产权归属
网络爬虫获取数据后牟利将带来法律风险
曾经有法院判处网络爬虫赔偿服务器网站巨额费用
网络爬虫泄露隐私
网络爬虫可能具备突破简单访问控制的能力,获得被保护数据从而泄露个人隐私
网络爬虫的限制
在实际的使用中一些较大的网站都对网络爬虫有相关的限制。在整个Internet上,也将网络爬虫作为一个可规范的功能来看待
对于一般的服务器来讲,可以用2种方式限制网络爬虫:来源审查和发布公告
来源审查
如果服务器/网站的所有者有一定的技术能力,可以通过来源审查来限制网络爬虫
在进行浏览器访问的时候,不论是浏览器还是访问的软件,都会把它自己设定一个标识,放在User-Agent里。对网站服务器,它判断你HTT[的协议头,如果的User-Agent字段,不是预定的浏览器,那很可能就是一个爬虫
发布公告
像一个告示牌,告诉所有的爬虫,网站上哪部分内容你可以爬取,那部分你不可以爬取。
但是是否遵守就要由网络爬虫自身来决定了
Robots协议
robots协议一定是放在网站的根目录下,并不是所有的网站都有robots协议(如教育部的网站),没有robots协议的网站默认允许所有爬虫无限制地爬取其页面内容
Robots协议的遵守方式
Requests库网络爬虫实战
①京东页面商品的爬取
爬取页面:【华为荣耀8】荣耀8 4GB+64GB 全网通4G手机 魅海蓝【行情 报价 价格 评测】-京东 (一款手机)
状态码是200,说明返回的信息正确,并且获得了这个链接相应的内容
编码是gdk,说明从http的头部分已经可以解析出这个页面的编码信息,说明京东的网站提供了页面信息的相关编码。
import requests url = 'https://item.jd.com/2967929.html' try: r = requests.get(url) r.raise_for_status() r.encoding = r.apparent_encoding print(r.text[:1000]) except: print('爬取失败')
raise_for_status()函数在返回的代码如果是200的情况下是不产生异常的,否则会产生异常。
捕捉异常可以使用try/except语句。
- try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
- 如果你不想在异常发生时结束你的程序,只需在try里捕获它。
②亚马逊商品页面的爬取
爬取页面:Amazon.cn
③百度/360搜素关键词提交
程序向百度/360这两个搜索引擎自动提交关键词并且获得它的搜索结果——python的request库
百度搜索全代码
import requests keyword = 'Python' try: kv = {'wd': keyword} r = requests.get('http://www.badu.com/s', params=kv) print(r.request.url) r.raise_for_status() print(len(r.text)) except: print('爬取失败')
360搜索全代码
import requests keyword = 'Python' try: kv = {'q': keyword} r = requests.get('http://www.so.com/s', params=kv) print(r.request.url) r.raise_for_status() print(len(r.text)) except: print('爬取失败')
④网络图片的爬取和存储
把我们看到的好看的网络图片存储下来
打开了一个文件,并且把它定义了一个文件标识符f,然后将返回的内容写回到这个文件中
r.content表示返回内容的二进制形式
f.write是写入到文件中获取图片的时候用图片原来的名字存取在本地
import requests import os url = 'http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg' root = 'D://pics//' path = root + url.split('/')[-1] try: if not os.path.exists(root): os.mkdir(root) if not os.path.exists(path): r = requests.get(url) with open(path,'wb') as f: f.write(r.content) f.close() print('文件保存成功') else: print('文件已存在') except: print('爬取失败')
⑤IP地址归属地的自动查询
一个IP地址是来自于北京、上海还是美国呢
import requests url = 'http://m.ip138.com/ip.asp?ip=' try: r = requests.get(url + '202.204.80.112') r.raise_for_status() r.encoding = r.apparent_encoding print(r.text[-500:]) except: print('爬取失败')