python爬取网页的库_利用requests库爬取网页获取数据
一、get请求
测试小例子:
获取一个get请求,用get的方式直接访问网址
url = 'https://movie.douban.com/top250'
response = requests.get(url)
response.encoding = 'utf-8' # 出现乱码使用,对获取到的网页源码进行一个utf-8解码
print (response.text) # 获取网页的HTML字符串,该方式往往会出现乱码
print (response.status_code) # 返回状态码
运行后的结果:
返回状态418,说明被发现是爬虫了,无法正常响应,因此无法成功获取该网页的HTML字符串

解决办法:
对自己进行伪装,不让发现自己是一个爬虫,而是一个浏览器,
一般加上headers信息User-Agent并发送(让豆瓣知道我们不是爬虫,而是一个这种类型的浏览器)
若想要伪装更多,可以加上更多的键值对,例如:data、method、host、cookie等等

获取一个get请求,用get的方式直接访问网址
url = 'https://movie.douban.com/top250'
header={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'}
response = requests.get(url,headers=header)
response.encoding = 'utf-8' # 出现乱码使用,对获取到的网页源码进行一个utf-8解码
print (response.status_code) #返回状态码
print (response.text) # 获取网页的HTML字符串,该方式往往会出现乱码
运行后结果:
状态码返回200,代表可以正常响应,也返回了该网页的HTML字符串

小知识:user-agent用户信息
有些网站有防御机制,抵御爬虫的访问,因此需要进行伪装


二、post请求
一个专门测试的网址:httpbin.org(请求和响应的一个服务,当你向它发送请求的时候,它会告诉你给你一些什么样的响应,可以通过这个方式可以测试一下你的请求是不是得到了你预期的响应,可以测试http)
例如测试post请求




进行代码测试:
获取一个post请求
respones=requests.post('http://httpbin.org/post')
print (respones.text)
运行后结果:

三、超时处理
在网络爬虫中会出现多种情况,例如链接是死链接或者链接的服务器有排斥的情况可能无法爬虫,所以需要监测
超时处理,在网络爬虫中会出现多种情况,例如链接是死链接或者链接的服务器有排斥的情况可能无法爬虫,所以有必要进行监测
try:
responses=requests.get('http://httpbin.org/get',timeout=0.01) # 超时的时间自己设置
print (responses.text)
except Exception as e:
print 'timeout'
运行后结果:

四、响应
responses属性:
responses=requests.get('http://www.baidu.com')
print (responses.status_code) # 返回状态码,例如200(表示正常响应),418(表示被发现爬虫了)
print (responses.headers) # 返回响应头,获取头部信息
print (responses.cookies)
print (responses.url)
运行后结果:

五、伪装
不让发现自己是一个爬虫,而是一个浏览器(与上文的get请求报错的解决方法一样)
代码:
伪装,不让发现自己是一个爬虫,而是一个浏览器
url='http://www.douban.com' # 不能直接访问,应对请求对象进行封装
#url='http://httpbin.org/post'
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'}
data={'name':'ruby','age':22} # 随意发送的data信息
respones=requests.post(url,headers=headers,data=data) # post请求
print (respones.text)
运行结果:

