requests,urllib,urllib3爬虫库使用

文章目录

  • Requests
    • 简介
    • 发送请求
      • url
      • 添加请求参数
      • 添加请求头
      • 添加cookies
      • 设置超时时间
      • 设置代理
      • 重定向
      • 证书忽略验证
      • POST请求发送Json数据
      • POST请求发送Form表单数据
    • response对象
    • session方法
        • **经典的登录逻辑**
        • session的使用
  • urllib与urllib3
    • 一.urllib库
      • 1.urllib.request模块
        • 1.发起网络请求
          • urlopen方法
          • **Request**对象
          • response对象
        • 2.添加请求头
        • 3.操作cookie
        • 4.设置代理
      • 2.urllib.parse模块
        • 单个参数转码
        • 多个参数转码
      • 3.urllib.error模块
        • URLError与HTTPError
      • 4.urllib.robotparse模块
        • 查看robots协议
    • 二.urllib3库
      • 特点
      • 安装
      • urllib3的使用
        • 发起请求
          • **基本步骤**
          • **request方法**
          • Proxies
          • **Request data**
          • response对象
    • 三.urllib3下载百度图片

Requests

简介

可以说Requests最大的特性就是其风格的简单直接优雅。无论是请求方法,还是响应结果的处理,还有cookies,url参数,post提交数据,都体现出了这种风格。

>>>import  requests
>>>res=requests.get("https://www.baidu.com")
>>>res.status_code
200
>>>res.headers["content-type"]
'text/html'
>>>res.encoding
>>>res.text
"\r\n

requests目前基本上完全满足web请求的所有需求,以下是requests的特性:

Keep-Alive & 连接池
国际化域名和URL
带持久Cookie的会话
浏览器式的SSL认证
自动内容解码
基本/摘要时的身份认证
优雅的 key/value Cookie
自动解压
Unicode 响应体
HTTP(S) 代理支持
文件分块上传
流下载
连接超时
分块请求
支持 .netrc

发送请求

使用 Requests 发送网络请求非常简单。导包,之后添加方法进行

import requests
r = requests.get('https://httpbin.org/get')#GET请求
r = requests.post('http://httpbin.org/post', data = {'key':'value'})#POST请求

发起请求的方法变得简单,我们只需要着重关注一下发起请求的参数 ,10个重要的参数。

def request(url,params=None, headers=None, cookies=None,timeout=None,
            allow_redirects=True, proxies=None,verify=None, data=None,json=None):
    pass

url

添加请求参数

添加请求头

添加cookies

设置超时时间

设置代理

import requests
test_url="http://httpbin.org/get"#测试url
params={"name1":"spider","name2":"爬虫"}#请求参数
#请求头
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"}
cookies={"sessionid":"hashcode","userid":"987654321",}
proxies={"http":"175.10.24.14:8888"}#示例代理ip
res=requests.get(test_url,params=params,headers=headers,cookies=cookies,timeout=10,proxies=proxies)

print(res.text)
#结果
{
  "args": {
    "name1": "spider", 
    "name2": "\u722c\u866b"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Cookie": "sessionid=hashcode; userid=987654321", 
    "Host": "httpbin.org", 
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36", 
    "X-Amzn-Trace-Id": "Root=1-5f129e9e-9b082a3be35197c55fad3d0a"
  }, 
  "origin": "175.10.24.14", 
  "url": "http://httpbin.org/get?name1=spider&name2=\u722c\u866b"
}

重定向

很多网站是http开头,为了不影响老客户,原网站不懂,当访问http的原网址时,重定向到新的https网址,在requests中 allow_redirects默认是True,如果是False则不允许重定向,也就无法重定向新网址获取数据。

import  requests
url="http://github.com"
res_gh=requests.get(url,allow_redirects=False)
print(res_gh.text)
print(res_gh.status_code)
#结果301

证书忽略验证

import requests
requests.urllib3.disable_warnings()#忽略warnning
url="https://inv-veri.chinatax.gov.cn/index.html"
res_ca=requests.get(url,verify=False)
res_ca.encoding="utf-8"
print(res_ca.text)

POST请求发送Json数据

import requests
json={"json_style":"json-data"}#json
test_url="http://httpbin.org/post"#测试url
res=requests.post(test_url,json=json)
res.encoding="utf-8"#指定  字符串输出编码格式
print(res.text)#直接转换成字符串 非字节码
#结果  data 与json里都有数据
{
  "args": {}, 
  "data": "{\"json_style\": \"json-data\"}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "27", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.23.0", 
    "X-Amzn-Trace-Id": "Root=1-5f12a62e-a9ceddee789e6c4618e77fc4"
  }, 
  "json": {
    "json_style": "json-data"
  }, 
  "origin": "113.247.22.91", 
  "url": "http://httpbin.org/post"
}

POST请求发送Form表单数据

import requests
data={"data1":"spider","data2":"验证数据"}#form 表单数据  有data  json为null
test_url="http://httpbin.org/post"#测试url
res=requests.post(test_url,data=data)
print(res.text)
#结果   form表单中有数据
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "data1": "spider", 
    "data2": "\u9a8c\u8bc1\u6570\u636e"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "55", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.23.0", 
    "X-Amzn-Trace-Id": "Root=1-5f12a6fa-7dd277ad475610d3e2dd237a"
  }, 
  "json": null, 
  "origin": "175.10.24.2", 
  "url": "http://httpbin.org/post"
}

注意:json和data不可以同时添加,同时添加会造成json中没有数据

response对象

属性

import requests
test_url="http://httpbin.org/get"#测试url
res=requests.get(url=test_url)
print(res.text)#直接转换成字符串 非字节码
print(res.content)#图片数据 使用此参数
print(res.status_code)#状态码
print(res.json()["headers"]["User-Agent"])#自动转换成 字典格式
print(res.headers)#响应头
print(res.cookies)#响应cookie
print(res.url)#请求的url
print(res.request.url)#请求的url
print(res.request.headers)#请求头

session方法

session方法是requests库发起请求的一种方法,这种方法会自动保存访问页面得到的cookie值,从而再次访问的时候会自动携带cookie,使得操作cookie方便,不需要我们自己添加cookie了。常用于登录;

经典的登录逻辑

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VsVpSLCP-1617439673458)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200718161350660.png)]

session的使用

基本的使用方法与requests.get 相似,使用的session的时候需要先创建session对象

session=requests.session()#创建session对象
session.headers=headers#添加请求头
res_ss=session.get(index_url)

requests与session发起请求对比

import requests

index_url="http://www.baidu.com"
res=requests.get(index_url)

# print(res.text)

#requests 请求头信息
print("请求头信息********requests*******")
print(res.request.headers)


#session的使用
index_url="http://www.baidu.com"
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"}

session=requests.session()#创建session对象
session.headers=headers#添加请求头
res_ss=session.get(index_url)
# print(res.text)
print("响应信息********session*******")
print(res_ss.headers)
print("请求头信息********session*******")
print(res_ss.request.headers)

文章目录

  • Requests
    • 简介
    • 发送请求
      • url
      • 添加请求参数
      • 添加请求头
      • 添加cookies
      • 设置超时时间
      • 设置代理
      • 重定向
      • 证书忽略验证
      • POST请求发送Json数据
      • POST请求发送Form表单数据
    • response对象
    • session方法
        • **经典的登录逻辑**
        • session的使用
  • urllib与urllib3
    • 一.urllib库
      • 1.urllib.request模块
        • 1.发起网络请求
          • urlopen方法
          • **Request**对象
          • response对象
        • 2.添加请求头
        • 3.操作cookie
        • 4.设置代理
      • 2.urllib.parse模块
        • 单个参数转码
        • 多个参数转码
      • 3.urllib.error模块
        • URLError与HTTPError
      • 4.urllib.robotparse模块
        • 查看robots协议
    • 二.urllib3库
      • 特点
      • 安装
      • urllib3的使用
        • 发起请求
          • **基本步骤**
          • **request方法**
          • Proxies
          • **Request data**
          • response对象
    • 三.urllib3下载百度图片

urllib与urllib3

简介 urllib是一个内置官方标准库,无需下载;它是python2中的urllib与urllib2的合并,

urllib3库是第三方标准库, 解决了线程安全,增加了连接池等功能,urllib与urllib3 相互补充;

一.urllib库

urllib库主要包含4个模块

  1. urllib.requests:请求模块
  2. urlib.error:异常处理模块
  3. urllib.parse:url解析模块
  4. urllib.robotparser :robots.txt解析模块

1.urllib.request模块

request模块主要负责构造和发起网络请求,并在其中添加Headers,Proxy等。

利用它可以模拟浏览器的请求发起过程。
1.发起网络请求。
2.添加Headers。
3.操作cookie。
4.使用代理。

1.发起网络请求
urlopen方法
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
  • 功能:urlopen是一个发送简单网络请求的方法,然后返回结果。
  • 参数:
    • url:必选;可以是一个字符串或一个 Request 对象。
    • data:None–GET请求;有数据(字节类型/文件对象/可迭代对象)–POST请求(POST请求的话,data数据会放进form表单进行提交);
    • timeout:有默认设置;以秒为单位,例:设置timeout=0.1 超时时间为0.1秒(如果超出这个时间就报错!)
  • 返回值:urlib库中的类或者方法,在发送网络请求后,都会返回一个urllib.response的对象。它包含了请求回来的数据结果。它包含了一些属性和方法,供我们处理返回的结果。
from urllib import  request
# test_url="http://httpbin.org/get"
test_url="http://httpbin.org/post"
res=request.urlopen(test_url,data=b"spider")
print(res.read())#字节串  所有的内容
# print(res.getcode())#获取状态码
# print(res.info())#获取响应头信息
# print(res.read())#字节串  再次读取,为空
Request对象

利用urlopen可以发起最基本的请求,但这几个简单的参数不足以构建一个完整的请求(添加请求头,添加不同过请求方法),可以通过构造来构建更加完整的请求。

class Request:
    def __init__(self, url, data=None, headers={},
                 origin_req_host=None, unverifiable=False,
                 method=None):
        pass
  • 功能:Request是一个构造完整网络请求的对象,然后返回请求对象。

  • 参数

    • url:必选;是一个字符串
    • data:字节类型
    • headers:请求头信息
    • method:默认GET,可填写 POST,PUT,DELETE等
  • 返回值:一个请求对象

#Request对象
test_url="http://httpbin.org/get"
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"}
req=request.Request(test_url,headers=headers)
res=request.urlopen(req)
print(res.read())
#Request对象   data   method  参数的使用
print("************************************")
test_url="http://httpbin.org/put"
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"}
req=request.Request(test_url,headers=headers,data=b"updatedata",method="PUT")
res=request.urlopen(req)
print(res.read())
response对象

urlib库中的类或或者方法,在发送网络请求后,都会返回一个urllib.response的对象。它包含了请求回来的数据结果。它包含了一些属性和方法,供我们处理返回的结果。

  • read() 获取响应返回的数据,只能用一次
print(res.read())
  • readline() 读取一行
while  True:
	data=response.readline()
	if data:
		print(data)
  • info() 获取响应头信息
print(response.info())
  • geturl() 获取访问的url
print(response.geturl())
  • getcode() 返回状态码
print(response.getcode())
2.添加请求头
test_url="http://httpbin.org/get"
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"}
req=request.Request(test_url,headers=headers)
res=request.urlopen(req)
print(res.read())
3.操作cookie
from  urllib  import request
from  http  import  cookiejar
#创建一个cookie对象
cookie=cookiejar.Cookiejar()
#创建一个cookie处理器
cookies=request.HTTPCookieProcessor(cookie)
#以它为参数创建Openner对象
opener=request.build_opener(cookies)
#使用这个openner来发送请求
res=opener.open("http://www.baidu.com")
4.设置代理
from  urllib  import  request
url='http://httpbin.org/ip'
#代理地址
proxy={'http':'180.76.111.69:3128'}
#代理处理器
proxies=request.ProxyHandler(proxy)
#创建openner对象
opener=request.build_opener(proxies)

res=opener.open(url)
print(res.read().decode())

2.urllib.parse模块

parse模块是一个工具模块,提供了需要对url处理的方法,用于解析url

url中只能包含ascii字符,在实际操作过程中,get请求通过url传递的参数 中会有大量的特殊字符,例如汉字,那么就需要进行url编码。

单个参数转码
  • parse.quote() 汉字转ascII码
from urllib import parse
name="猫咪"
asc_name=parse.quote(name)# 汉字转ascII码
print(asc_name)  #%E7%8C%AB%E5%92%AA
  • parse.unquote()
from urllib import parse
new_name=parse.unquote(asc_name)#ascII码转汉字
print(new_name)#猫咪
from urllib import parse,request

#quote  unquote
name="猫咪"
asc_name=parse.quote(name)# 汉字转ascII码
print(asc_name)  #%E7%8C%AB%E5%92%AA
test_url="http://httpbin.org/get?name={}".format(asc_name)
print(test_url) #http://httpbin.org/get?name=%E7%8C%AB%E5%92%AA
res=request.urlopen(test_url)
print(res.read())
new_name=parse.unquote(asc_name)#ascII码转汉字
print(new_name)#猫咪
多个参数转码

在发送请求的时候,往往会需要传递很多的参数,如果用字符串方法去拼接会比较麻烦,parse.urlencode()方法可以将字典转换为url的请求参数并完成拼接。也可以通过parse.parse_qs()方法将它转回字典

  • parse.urlencode()
  • parse.parse_qs()
from urllib import parse,request
params={"name":"猫咪","name2":"老虎","name3":"熊猫"}
asc_name=parse.urlencode(params)# 将要字典形式  转成url请求参数形式
print(asc_name)#name=%E7%8C%AB%E5%92%AA&name2=%E8%80%81%E8%99%8E&name3=%E7%86%8A%E7%8C%AB
test_url="http://httpbin.org/get?{}".format(asc_name)
print(test_url)
#http://httpbin.org/get?name=%E7%8C%AB%E5%92%AA&name2=%E8%80%81%E8%99%8E&name3=%E7%86%8A%E7%8C%AB
res=request.urlopen(test_url)
print(res.read())

#parse_qs 转换回原来的形式
new_params=parse.parse_qs(asc_name)
print(new_params)#{'name': ['猫咪'], 'name2': ['老虎'], 'name3': ['熊猫']}

3.urllib.error模块

URLError与HTTPError

error模块主要负责处理异常,如果请求出现错误,我们可以用error模块进行处理
主要包含URLError和HTTPError

  • URLError:是error异常模块的基类,由request模块产生的异常都可以用这个类来处理
  • HTTPError:是URLError的子类,主要包含三个属性:
    • Code:请求的状态码
    • reason:错误的原因
    • headers:响应的报头
from  urllib  import  error,request

try:
    res=request.urlopen("https://jianshu.com")
    print(res.read())
except error.HTTPError as e:
    print(e.code)
    print(e.reason)
    print(e.headers)

4.urllib.robotparse模块

robotparse模块主要负责处理爬虫协议文件,robots.txt.的解析。(君子协定)爬虫一般不会去遵守,所以基本不会使用这个模块;

查看robots协议

在网址之后添加robots.txt即可。

比如:百度的robots协议:
http://www.baidu.com/robots.txt即可查看。

Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

robots.txt文件是一个文本文件,使用任何一个常见的文本编辑器,比如Windows系统自带的Notepad,就可以创建和编辑它 。robots.txt是一个协议,而不是一个命令。robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。

二.urllib3库

特点

Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库里所没有的重要特性:

1、 线程安全

2、 连接池

3、 客户端SSL/TLS验证

4、 文件分部编码上传

5、 协助处理重复请求和HTTP重定位

6、 支持压缩编码

7、 支持HTTP和SOCKS代理

8、 100%测试覆盖率

安装

通过pip命令来安装:pip install urllib3

urllib3的使用

发起请求
基本步骤

1.导入 urllib3库

import utllib3

2.实例化一个PoolManager对象,这个对象处理了连接池与线程安全的所有细节

http=urllib3.PoolManager()

3.用request方法发送一个请求

res=http.request("GET","http://www.baidu.com")
request方法
  • 源码:
request(self, method, url, fields=None, headers=None,**urlopen_kw)
  • 功能:发送完整的网络请求
  • 参数:
    • method:请求方法 GET ,POST,PUT,DELETE…
    • url:字符串格式
    • fields:字典类型 GET请求时转化为url参数 POST请求时会转化成form表单数据
    • headers:字典类型
  • 返回值:response对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RtlacTWr-1617439673464)(%E7%88%AC%E8%99%AB%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A8.assets/request%E6%96%B9%E6%B3%95-1614757094019.png)]

Proxies

可以利用ProxyManager进行http代理操作

proxy=urllib3.ProxyManager('http://180.76.111.69:31281)
res=proxy.request('get','http://httpbin.org/ip')
print(res.data)
Request data
  • get,head,delete请求,可以通过提供字典类型的参数fields来添加查询参数

  • 对于post和put请求,需要通过url编码将参数编码成正确格式然后拼接到url中

  • JSON
    当我们需要发送json数据时,我们需要在request中传入编码后的二进制数据类型的body参数,并制定Content-Type的请求头

http=urllib3. PoolManager() 
data={' attribute':' valuel}
encoded_data=json. dumps(data).encode(' utf-81)
r=http. request('post',
				'http://httpbin.org/post', 
                body=encoded_data, 
                headers={' Content-Type1:' appLication/json"})
print(json. loads(r.data.decode(' utf-81))[' json'])
  • Files
    对于文件上传,我们可以模仿浏览器表单的方式
with open('example.txt') as fp: 
	file_data=fp.read()
r=http.request('POST',
               'http://httpbin. org/post', 
               fields={'filefield':('example.txt', file_data)}
              )
print(json.loads(r.data.decode('utf-8'))['files'])
  • binary data

对于二进制的数据上传,我们用指定body的方式,并设置Content-Type的请求头

http=urllib3. PoolManager()
with open('example.jpg','rb') as fb: 
	binary_data=fb. read()
r=http.request('post',
                'http://httpbin.org/post', 
                body=binary_data, 
                headers={'Content-Type':'image/jpeg'}
               )
print(json.loads(r.data.decode('utf-8')))
response对象
  • http响应对象提供status, data,和header等属性
http=urllib3.PoolManager()
r=http.request('GET','http://httpbin.org/ip')
print(r.status)
print(r.data)
print(r.headers)

#结果
200
b'{\n  "origin": "113.246.85.63"\n}\n'
HTTPHeaderDict({'Date': 'Fri, 17 Jul 2020 15:18:02 GMT', 'Content-Type': 'application/json', 'Content-Length': '32', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'})
  • JSON content

返回的json格式数据可以通过json模块,loads为字典数据类型

import urllib3
import json 
http=urllib3.PoolManager()
r=http.request('GET','http://httpbin.org/ip')
print(json.loads(r.data.decode('utf-8')))
#结果
{'origin': '175.10.25.136'}
  • Binary content

    响应返回的数据都是字节类型,对于大量的数据我们通过stream来处理更好

import urllib3
http=urllib3.PoolManager()
r=http.request('GET','http://httpbin.org/bytes/10241, preload_content=False)
for chunk in r.stream(32): 
	print(chunk)

​ 也可以当做一个文件对象来处理

http=urllib3.PoolManager()
r=http.request(' GET','http://httpbin. org/bytes/10241', preload_content=False)
for line in r: 
    print(line)

三.urllib3下载百度图片

#1.目标数据是图片
#2.请求流程  1.先访问page页获取图片url,2.对url发起请求,获取图片数据,3.存储

#3构造请求
import re
import os
import urllib3
http=urllib3.PoolManager()
#获取page页数据
headers={"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Cookie": "winWH=%5E6_1366x657; BDIMGISLOGIN=0; BDqhfp=%E7%8C%AB%E5%92%AA%26%260-10-1undefined%26%260%26%261; BAIDUID=31BE3CEB3DDB7ADCA3C987A69863BD4A:FG=1; PSTM=1585467854; BIDUPSID=6B73B5EB3CF18DDDF94A54DB137A0C70; H_WISE_SIDS=139912_143435_142019_144427_141875_141748_143789_144420_142780_144483_136862_144489_131246_141261_144741_138883_141942_127969_140066_143999_140593_143057_141808_140351_141008_143470_144727_143923_144376_131423_144289_142207_143704_143519_107318_138595_139910_144306_143478_142427_140368_138662_142505_141910_144238_142113_143859_136751_140843_110085; BDUSS=UR4a0I0UTR-QmpvflZJdlB4bnduUUR3UGx-ekhlblloSUpsSzZHT3Y1VUdOVTlmRVFBQUFBJCQAAAAAAAAAAAEAAADGU~YYtv63rMrC0rUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaoJ18GqCdfO; BDUSS_BFESS=UR4a0I0UTR-QmpvflZJdlB4bnduUUR3UGx-ekhlblloSUpsSzZHT3Y1VUdOVTlmRVFBQUFBJCQAAAAAAAAAAAEAAADGU~YYtv63rMrC0rUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaoJ18GqCdfO; __yjs_duid=1_aebcd34bae6eb31144a93ee9ce01016e1611491945901; indexPageSugList=%5B%22%E7%99%BE%E5%BA%A6%E5%9B%BE%E7%89%87%22%2C%22%E7%8C%AB%E5%92%AA%22%2C%22%E6%88%91%E8%A6%81%E5%AD%A6%E4%B9%A0%22%2C%22%E5%9B%BE%E7%89%87%22%2C%22%E8%AE%BE%E8%AE%A1%22%2C%22tornado%22%2C%22%E7%8B%97%E5%AD%90%22%2C%22%E4%BA%91%E6%B2%83%E5%AE%A2%E4%B8%8A%E7%9A%84%E6%8A%95%E6%A0%87%E6%98%AF%E6%80%8E%E4%B9%88%E5%9B%9E%E4%BA%8B%2C%E6%98%AF%E9%9C%80%E8%A6%81%E5%86%99%E5%A5%BD%E4%BB%A3%E7%A0%81%E5%86%8D%E6%8A%95%E6%A0%87%E4%B9%88%22%2C%22%E7%BE%8E%E5%9B%BE%E7%A7%80%E7%A7%80%E5%8E%BB%E9%99%A4%E5%9B%BE%E7%89%87%E6%B0%B4%E5%8D%B0%22%5D; BAIDUID_BFESS=59B0BC4A359EF2EC96697A13EDBA3229:FG=1; H_PS_PSSID=33256_33273_33595_33392_33460_26350_22157; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; delPer=0; PSINO=7; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BA_HECTOR=akahag2ga00g2h2hrv1g39gds0r; BDRCVFR[X_XKQks0S63]=mk3SLVN4HKm; firstShowTip=1; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; BDRCVFR[tox4WRQ4-Km]=mk3SLVN4HKm; userFrom=null; ab_sr=1.0.0_OTM2Nzg1MDY3YzUxYmJlZDNjZTI2ZjY0Yjc0MjQ4NTIwNzg5ODc1MjEwNjBhNTdjOGY1MmJjNWU5NzM3YTEzMmYwNGVlODA1MTkzYmRiZDAwNmM4YTgyMGNmYjQ0NjVl; BDRCVFR[CLK3Lyfkr9D]=mk3SLVN4HKm",
"Host": "image.baidu.com",
"sec-ch-ua": '"e";v="88", ";Not A Brand";v="99"',
"sec-ch-ua-mobile": "?0",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36",}

page_url="https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=%E7%8C%AB%E5%92%AA"

res=http.request("GET",page_url,headers=headers)
text=res.data.decode()

#获取 图片url
imgs_url=re.findall('"thumbURL":"(.*?)"',text)
# print(imgs_url)

#对图片url 发起请求  获取图片数据
headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"}
for index,img_url   in  enumerate(imgs_url):
    if "\\" in img_url:
        img_url=img_url.replace("\\","")
    # print(img_url)
    res=http.request("GET",img_url,headers=headers)
    # print(res.status)
    img_data=res.data

    #存储图片数据
    if not os.path.exists("cat"):
        os.mkdir("cat")
    img_name="cat/"+str(index)+".jpg"
    with  open(img_name,"wb") as f:
        f.write(img_data)

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