Python爬虫学习之requests

Python爬虫学习之requests

  • requests的使用
    • 安装
    • 使用
    • Get请求
      • 样例
      • 添加参数
      • 添加请求头
    • Post请求
      • 样例
      • 添加参数
      • 添加请求头
    • 数据提取
    • Cookie设置
    • SSL证书验证

requests的使用

安装

在开始使用之前,需要安装 requests 库,使用命令安装如下所示:

// pip 命令
pip install requests
//pip3 命令
pip3 install requests
//conda 命令
conda  install requests

使用

使用前,先导入requests模块

import requests

Get请求

样例

# 样例
import requests

res = requests.get("https://www.httpbin.org/get")

print(res.text)

# 结果
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.28.2", 
    "X-Amzn-Trace-Id": "Root=1-64535bd0-4d4182d41da1a0585ff15ed7"
  }, 
  "origin": "183.211.107.32", 
  "url": "https://www.httpbin.org/get"
}

可以发现我们成功的发起了Get请求,返回的结果包含请求头等信息。

添加参数

如果要附加额外的信息,例如添加年龄怎么办呢?那么可以直接在请求链接上直接添加参数。

https://www.httpbin.org/get?age=26

发起Get请求

res = requests.get("https://www.httpbin.org/get?age=26")

但是通过这样方式请求链接,需要我们手动的拼接参数,如果参数量大的话容易出错,看起来也不太美观。
因此,我们可以通过get方法提供的params参数来传递请求参数。如下所示:

import requests

data = {
    'age': '26'
}
res = requests.get("https://www.httpbin.org/get", params=data)

print(res.text)
# 运行结果
{
  "args": {
    "age": "26"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.28.2", 
    "X-Amzn-Trace-Id": "Root=1-64535dbc-0bad16180f6f64265c254ff7"
  }, 
  "origin": "183.211.107.32", 
  "url": "https://www.httpbin.org/get?age=26"
}

添加请求头

在上面的例子中我们可以看到,我们的请求头中的User-Agent的值是python-requests/2.28.2。这表示我们使用的是requests发起请求的。这样的话某些网站就会发现我们使用的不是正常的浏览器发起的请求,可能就会拒绝我们正常访问,导致抓取数据失败。

解决办法就是添加请求头,设置User-Agent参数值。

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
}

完整代码如下:

import requests

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
}
res = requests.get("https://www.httpbin.org/get", headers=headers)

print(res.text)
# 运行结果
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Host": "www.httpbin.org", 
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36", 
    "X-Amzn-Trace-Id": "Root=1-64536063-4c569c9a716da103015a3be1"
  }, 
  "origin": "183.211.107.32", 
  "url": "https://www.httpbin.org/get"
}

从返回结果可以看到我们的请求头中的User-Agent的值已经改变,这样我们就可以模拟浏览器来访问网页,抓取数据。

Post请求

样例

# 样例
import requests

res = requests.post("https://www.httpbin.org/post")

print(res.text)

# 结果
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Content-Length": "0", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.28.2", 
    "X-Amzn-Trace-Id": "Root=1-64536171-5fd594ae2f616f9d471133c1"
  }, 
  "json": null, 
  "origin": "183.211.107.32", 
  "url": "https://www.httpbin.org/post"
}

可以发现我们成功的发起了Post请求,返回的结果包含请求头等信息。

添加参数

我们可以通过post方法提供的data参数来传递请求参数。如下所示:

import requests

data = {
    'age': '26'
}
res = requests.post("https://www.httpbin.org/post", data=data)

print(res.text)
# 运行结果
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "age": "26"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Content-Length": "6", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.28.2", 
    "X-Amzn-Trace-Id": "Root=1-64536207-2dc6940f2e5a468049f750e4"
  }, 
  "json": null, 
  "origin": "183.211.107.32", 
  "url": "https://www.httpbin.org/post"
}

添加请求头

与Get方式相同

完整代码如下:

import requests

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
}
data = {
    'age': '26'
}
res = requests.post("https://www.httpbin.org/post", data=data, headers = headers)

print(res.text)
# 运行结果
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "age": "26"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Content-Length": "6", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "www.httpbin.org", 
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36", 
    "X-Amzn-Trace-Id": "Root=1-64536243-0e29b5bd6625ae654e4032e6"
  }, 
  "json": null, 
  "origin": "183.211.107.32", 
  "url": "https://www.httpbin.org/post"
}

数据提取

可以使用最基础的正则表达式来匹配内容,如下获取笔趣阁首页的小说名字。

import re
import requests

res = requests.get("http://www.biqugei.net/")
pattern = re.compile('')
titles = re.findall(pattern, res.text)
print(titles)
# 运行结果
['极品吹牛系统', '宿命之环', '无相鬼书', '绝世驭鬼师:邪王,要翻身!', '(快穿)元帅你服不服', '逆天小萌妃:魔帝撩够没', '梵天战帝', '太古战天诀', '驭兽主宰', '仙在囧途:天上掉下个仙妹妹', '恶魔校草缠上身:吻安,公主殿下', '禁爱军少,撩不停!', '修仙界归来', '帝少诱妻成瘾:前妻,束手就擒', '一切从棋魂开始', '攀上董事长夫人:一号职员', '超级修炼系统', '幸孕甜妻:总裁好凶猛', '乡村极品小仙医', '仙凡奇谭', '超级妖猴闯西游', '将进酒', '楚少归来', '英雄联盟:新时代', '花都透视仙医', '神印王座II皓月当空', '快穿:傲娇女配养成记', '巡天司', '极品相师', '巨甜!我在禁欲冷王的怀里恃宠而骄', '某法师的死神', '最强十二生肖', '霸道灵夫好难缠', '一世魔途', '消费系男神', '嫡策', '无极之不死印', '魁诗', '海贼:狂雷之灾', '天幕下的恋人们', '妖娆医妃:腹黑冥帝,太凶猛', '妃常难宠:朕的皇后不好惹', '捡个妖孽扛回家', '萌宝来袭:邪王大人,跪安吧!', '空港喵影', '腹黑冷王:娘子不太乖', '烽火博物馆', '我是庶子', '不做你的宠:御狐', '爆笑兵王', '我带游戏到现实', '超自然乐园', '异界之时间行者', '英雄联盟之天下第一辅助', '战争鬃犬', '异界乒乓', '别碰那只安妮', '控卫逐风传说', '状态掌控者', '网游之暗夜天下']

使用正则表达式提取信息,过程比较繁琐且难度较大,而网页中的节点定义有class或id等属性,节点之间还有层次关系,因此可以通过网页的节点来获取数据。在Python中,相关的解析库有很多,如下所示:

lxml
Beautiful Soup
puquery
parsel
...

Cookie设置

  1. 通过headers方式添加cookie
headers = {
    'Cookie': 'CA_VID=1683184739660208; CA_RF5=532af4e82f5d4998; CA_LVT=1683184739660208; CA_VSD=20230504; PHPSESSID=tecofitnb2ng6hm7d7qvgsq3uc; ss_userid=976; ss_username=wxyTest; ss_password=f0ea3d675245a48b933f3692aaf96923; CA_VV=9.1.9.1; CA_LAT=1683188389639; CA_PPI=f338ae09f72dd812-1683188389639-1683188388865315'
}

res = requests.get("http://www.biqugei.net/history.html", headers=headers)
  1. 通过参数cookies添加
ck = requests.cookies.RequestsCookieJar()

cookies = 'CA_VID=1683184739660208; CA_RF5=532af4e82f5d4998; CA_LVT=1683184739660208; CA_VSD=20230504; PHPSESSID=tecofitnb2ng6hm7d7qvgsq3uc; ss_userid=976; ss_username=wxyTest; ss_password=f0ea3d675245a48b933f3692aaf96923; CA_VV=9.1.9.1; CA_LAT=1683188389639; CA_PPI=f338ae09f72dd812-1683188389639-1683188388865315'

for cookie in cookies.split(';'):
    key, value = cookie.split('=', 1)
    ck.set(key, value)
res = requests.get("http://www.biqugei.net/history.html", cookies=ck)
print(res.text)

SSL证书验证

设置参数verify值为False,请求时不再验证证书是否有效。

res = requests.get("http://www.biqugei.net/", verify=False)

你可能感兴趣的:(爬虫,python,爬虫,学习)