python爬虫利器之requests库

    技术2024-07-06  72

    requests库

    源码传送门

    requests库借助了urllib3库,相较于urllib库,代码更加简单,爬虫效率更高。

    1.安装

    在cmd中执行下列代码来安装requests库。

    pip install requests

    2.请求

    2.1.GET请求

    我们直接使用requests.get()方法创建请求对象,例如,

    import requests response = requests.get("http://www.baidu.com") # get()方法中的参数为所爬网页的url地址

    requests库中获取可以通过.text或.content返回数据。注意,.text会在返回数据的时候自动进行解码,可能会出现解码错误;而.content会直接返回字节流数据,需要我们自己通过decode()方法自行解码。例如,

    print(response.text) # unicode格式的数据,自动解码 print(type(response.text)) print(response.content) # 返回字节流数据 print(response.content.decode('utf-8'))

    我们还可以返回以下数据,

    print(response.url) # 返回完整的url地址 print(response.encoding) # 返回响应头的字符编码 print(response.status_code) # 返回响应码

    如果我们需要以GET方法传入相关数据,需要给requests.get()传入params参数。注意,这里传入的数据不需要通过urlencode()进行处理,直接以字典的形式传入即可。

    同样,为了防止服务器发现我们是爬虫,需要给给requests.get()传入header参数。

    例如,我们要获取使用百度搜索得到的python的相关结果,

    import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Edg/83.0.478.56", } params = { 'wd': 'python', } # 相关参数 response = requests.get("http://www.baidu.com", params=params, headers=headers) print(response.content.decode('utf-8'))

    2.2.POST请求

    POST请求需要使用requests.post()方法。

    与urllib的POST请求相同,我们只需给requests.post()方法添加data参数,即可实现POST请求。

    例如,我们要爬取有道翻译的翻译结果,

    import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Edg/83.0.478.56", } url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule" # url地址 keyword = input("请输入要查询的单词:") # 输入要翻译的单词 data = { "i": keyword, "from": "AUTO", "to": "AUTO", "smartresult": "dict", "client": "fanyideskweb", "salt": "15936963039542", "sign": "f0ca3de0336ac08733c16d04ced62633", "ts": "1593696303954", "bv": "971477db6e42007c994a2623150c1717", "doctype": "json", "version": "2.1", "keyfrom": "fanyi.web", "action": "FY_BY_CLICKBUTTION", } # 传入相关data参数,相关参数可以在浏览器的“检查”-“网络”中找到 response = requests.post(url, data=data, headers=headers) # 处理获取的数据 dic = response.json() print(dic['translateResult'][0][0]['tgt'])

    3.代理

    为了防止IP地址被封,我们需要使用代理来爬取数据。

    我们只需给requests.get()方法传入proxies参数即可实现代理。注意,proxies参数必须是字典形式,键为网络协议名称,值为IP地址加端口号。例如,

    import requests import random headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Edg/83.0.478.56", } ip_lists = [ {'http': 'http://125.108.92.173:9000'}, {'http': 'http://113.128.25.249:9999'}, {'http': 'http://122.4.45.140:9999'}, {'http': 'http://36.248.129.170:9999'}, ] proxy = random.choice(ip_lists) # 随机选取一个代理IP地址 response = requests.get("http://httpbin.org/ip", proxies=proxy, headers=headers) print(response.text)
    Processed: 0.012, SQL: 12