通用爬虫模块使用(中)

Posted eyes++

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通用爬虫模块使用(中)相关的知识,希望对你有一定的参考价值。

一:requests发送POST请求

哪些时候我们会用到POST请求:

  • 登陆注册(POST比GET更安全)
  • 传输大文本内容(POST请求对数据长度没要求,GET有)

POST请求用法:

response = requests.post("https://www.baidu.com/", data=data, headers=headers)

以下是百度的示例:

获取到接口地址和参数后我们就可以用python发请求了:

import requests

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0"}
data = {
	"from": "zh",
	"to": "en",
	"query": "人生苦短,我用python",
	"transtype": "realtime",
	"simple_means_flag": "3",
	"sign": "289133.35420",
	"token": "b409912a85846ee1e437236ba0491f3c",
	"domain": "common"
}
post_url = "https://fanyi.baidu.com/v2transapi"

r = requests.post(post_url, data=data, headers=headers)
print(r.content.decode())

运行结果如下:
很明显出了错,通过多次抓取翻译请求,发现携带的参数中sign是变化的,token是不变的,通过代码查找发现token是固定的:
而没有找到sign,因此暂时无法找到sign的生成算法,这个接口应该是用不了了。。。。。。无所谓,反正这也不是写如何调用百度翻译接口的博客。。。。。

二:requests使用代理

代理引用知乎上的解释就是:代理就是用服务器(其他人的电脑)帮你访问要访问的网页。和召唤美团快递小哥一个道理。餐厅老板和你,你们俩谁都没见过谁。在这个过程中,只有快递小哥知道你家地址,老板并不知道,(不好吃就给个差评,老板也找不到你)是不是很安全。
而代理分为正向代理和反向代理:

代理服务器(Proxy Serve):提供代理服务的电脑系统或其它类型的网络终端,代替网络用户去取得网络信息。

使用代理服务器的好处

  • 提高访问速度:由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门网站能明显提高访问速度。
  • 防火墙作用:由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可以在代理服务器上设限,过滤掉某些不安全信息。同时正向代理中上网者可以隐藏自己的IP,免受攻击。
  • 突破访问限制:互联网上有许多开发的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问目标站点,通俗说,我们使用的翻墙浏览器就是利用了代理服务器,可以直接访问外网。

正向代理: 正向代理(forward proxy) ,一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并制定目标(原始服务器),然后代理向原始服务器转发请求并将获得的内容返回给客户端,客户端才能使用正向代理。我们平时说的代理就是指正向代理。

反向代理: 反向代理(Reverse Proxy),以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求的客户端,此时代理服务器对外表现为一个反向代理服务器。

为什么爬虫需要使用代理:爬虫可能会频繁请求服务器数据,使用代理可以让服务器以为不是同一个客户端在请求,防止我们的真实地址被泄露,防止被追究。

使用代理
用法:requests.get(URL, proxies=proxies)
proxies的形式:字典
例如:

proxies = {
    "http": "http://12.34.56.78.8000",
    "https": "https://12.34.56.78.8000"
}

对于代理地址,国内有很多公司会提供免费代理ip,大家可以自行百度搜索。

一次简单的代理使用:

import requests

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0"}
proxies = {"https": "https://47.98.183.59:3128"}

r = requests.get("https://www.runoob.com", proxies=proxies, headers=headers)

print(r.status_code)

我使用的时候编译器报错了:
百度之后发现是因为我的requests库版本太高,解决方法就是降低requests模块的版本或者是降低urllib3的版本,我采用的是降低urllib3的版本:(注意安装模块前,要关闭)fiddler抓包工具。我是直接在pycharm中进行修改的,也可以使用 pip install 指定版本进行安装:

pip install urllib3==1.25.8

然后就成功了:

使用代理需要注意的事项:

  • 为了防止同一ip多次请求服务器导致被封ip,一般爬虫需要大量代理ip形成ip池,每次请求时随即调用其中的某个
  • 使用ip池的时候,需要对每个ip先进行判断是否有效,然后再去使用它进行代理请求,判断是否有效可以判断返回的状态码,并且注意请求方式是http还是https

三:requests携带cookie

使用爬虫的时候有时候需要带上cookie或session。带上cookie、session的好处就是能够请求到登录之后的页面,但是也有弊端,一套cookie和session往往与一个用户对应,请求太快,请求次数太多都容易被服务器识别为爬虫,所以不需要cookie的时候尽量不使用cookie,怕被封号。当然也可以注册一堆账号,这样就有一堆cookie了,cookie池的使用方式跟ip池一样。

requests提供了一个session类来实现客户端和服务端的会话保持。
使用方法:

  1. 实例化一个session对象
  2. 让session发送get或者post请求

如:

session = request.session()  # 先使用session发送一次请求,这样就有cookie了
response = session.get(url, headers)  # 带上之前的cookie请求数据

以下代码只是个session使用示例,现在大多数的网站都会加密密码再发送给后端,所以模拟登录很麻烦:

import requests

url = "https://xxxxxx.com"
data = {
    "email": "123456789@qq.com",
    "password": "123456789"
}
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
}
# 实例化一个session对象
session = requests.session()
# 使用session发送post请求,cookie保存在其中
session.post(url, data=data, headers=headers)
# 在使用session进行请求登录之后才能访问的地址
r = session.get("http://xxxxxx.com/home", headers=headers)
# 保存页面
with open("xxxxxx.html", "w", encoding="utf-8") as f:
    f.write(r.content.decode())

如果有兴趣了解更多相关内容的话,可以来我的个人网站看看:eyes++的个人空间

以上是关于通用爬虫模块使用(中)的主要内容,如果未能解决你的问题,请参考以下文章

GNE: 4行代码实现新闻类网站通用爬虫

Python 教你 4 行代码开发新闻网站通用爬虫

爬虫简介

GNE v0.1正式发布:4行代码开发新闻网站通用爬虫

scrapy按顺序启动多个爬虫代码片段(python3)

Eclipse 中的通用代码片段或模板