python爬虫我爱编程超详细的python爬虫入门,从 requests 到 scrapy

python爬虫系列之 requests: 让 HTTP 服务人

2018-05-18  本文已影响51人  渔父歌

一、安装requests库

pip install requests

二、发起一个简单的网络请求

requests支持所有的HTTP请求,以最常用的get方法为例:

import requests


url = 'https://www.baidu.com'
response = requests.get(url)

比想象中要简单的多吧,只要把要访问的网址当作参数传递给requests.get方法,就可以获得所请求的网页。

请求成功后会返回一个Response对象,我们把这个对象叫做响应。

三、对响应的操作

状态码 描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

​ 需要注意的是,如果收到5开头的http状态码。

​ 很多情况下并不是服务器发生了错误,而是服务器并不想回应你的请求,所以返回5**敷衍一下 你。

​ 这在编写爬虫代码时经常发生,如果你在爬取网页时出现了5**错误,就应该想想哪里出错了。

​ 想了解更多关于http状态码的问题可以点击文末的链接

四、更加复杂的请求

你可能觉得前面讲的太简单了,不过别担心,现在才真正开始呢。

别紧张,只是复杂了一点,就像加减法到乘法一样。

有的时候我们要爬 的网站有反爬措施,这个时候简单的get请求会得到错误的响应。

因此,我们需要做点什么来跳过网站的反爬机制。

要跳过反爬机制,我们需要先了解一下网站是怎样反爬的。

大多数网站都是通过请求头(headers)和 cookie来鉴别爬虫的,cookie现在先不讲(因为用到cookie的地方一般需要登录,而登录又涉及到模拟登录的问题,所以先放这儿,等以后需要了再讲)

也有少量的网站是通过 IP来鉴别爬虫的,同一个 IP访问频率过快就会遭到封禁,这时还想继续爬就得用代理。

不过一般的服务器还是通过headers来区别爬虫与人的,所以我们只要伪造一个headers就能以假乱真,这样我们又可以开心地爬了<( ̄︶ ̄)↗[GO!]

这时候可能有人会问,怎么伪造headers呢?

有一个简单粗暴的方法就是直接用chrome的开发者模式把网站的请求头复制下来,不过对付一般的网站我们只需要user-agent就行(有些甚至不需要 headers)。

伪造好 headers后,headers传递给 get方法的 headers参数就可以用伪造的 headers来访问网站了

#简单粗暴的方法
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'max-age=0',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Host': 'www.baidu.com',
    'Proxy-Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36',
}
#一般的方法
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36',
}

r = requests.get(url, headers=headers)

五、高级用法 session会话

在一些需要登录的网站中我们需要跨请求保持 cookie,但是前面所讲的 post和 get方法不会保存 cookie。

虽然我们可以通过提取 cookie给 headers参数来保持 cookie,但这种方法有个缺点就是必须要手动提取 cookie,要是碰到上百个登录... ...

幸好 requests库的 Session类可以跨请求保持 cookie,省去了我们的体力劳动。

session的使用很简单,下面通过几行代码来演示 session的使用:

#获得一个 session实例 想要跨请求保持 cookie必须在同一个 session下调用方法
session = requests.Session()

url = 'https://www.baidu.com'

#get方法
r = session.get(url)
#post方法
r = session.post(url, data=data)

六、总结

有问题欢迎评论

http状态码:HTTP状态吗|菜鸟教程

下一篇:python爬虫系列之 requests实战:用 requests库下载网页和图片

求赞
上一篇 下一篇

猜你喜欢

热点阅读