爬虫知识库详解和案例实操

目录

一、urllib

1、request简介

1.1 urlopen

1.2 data参数设计

1.3 timeout参数

1.4 Request方法

1.5 高级用户(Cookie、代理)

身份认证:

代理:

Cookie:

2、urllib——error模块

2.1 URLerror模块

2.2 HTTPError

3、urllib——parse模块

3.1 urlparse方法

3.2 urlunparse方法

3.3 urlsplit方法

3.4 urlunsplit方法

3.5 urlencode方法

3.6 parse_qs方法

3.7 parse_qsl方法

3.8 quote方法

3.9 unquote方法

3.10 urljion

4、urllib——robotparser模块

4.1 Robots协议

4.2 爬虫名称

4.3 robotparser

二、 requests

1 request请求介绍

2 GET请求

3、抓取网页信息

4、抓取二进制数据

5、添加请求头

6 POST请求

7 响应

8 上传文件

9 Cookie设置

10 session维持

11 SSL证书认证——verify参数

12 超时设置

13 身份验证

14 代理设置——proxies

15 Prepared Request

三、正则表达式

1 常用正则表达式的匹配规则

正则表达式——只保留中文/汉字字符(过滤非汉字字符

2 re库

2.1 match

2.2 匹配目标

2.3 通用匹配

2.4 贪婪和非贪婪

2.5 修饰符

2.6 转移匹配

2.7 search匹配

2.8 findall方法

2.9 sub方法

2.10 compile方法

四、httpx的使用

1 httpx基本用法

2 Client对象

3 HTTP/2.0

4 支持异步请求

五,Python logging 模块之 logging.basicConfig 用法和参数详解

1.1. logging 模块简介

2 logging.basicConfig(**kwargs)

1.4 使用文件(filename)保存日志文件

1.5 设置日志中的时间格式

六、python——json

1 JSON介绍

1.1 json介绍

1.2 json特点

1.3 json 文件的处理

1.4 json语法规则

1.5 json

1.6 json文件的书写

1.7 读取json文件的方法(json. load)

2 json常用函数

2.1 load和loads

七 python——os库

1 os库介绍

2 os使用

3 os库的常用方法

4 操作目录

5 操作路径

八 python——sys库

1 sys概述

2 sys使用

2.1 sys查看

2.2 sys常用属性

2.3 sys常用方法

九、 爬取静态网页实例

1 要求

2 yield 用法

3 测试代码

4 爬取壁纸实例(自己编写的实例,暴力的正则匹配,main函数测试的时候使用break)

十、XPath库

1 XPath常用规则

2 XPath用例

3 匹配所有节点

4 子节点

5 父节点

6 属性匹配

7 文本获取

8 属性获取

9 属性多值匹配

10 多属性匹配

11 按序选择

12 节点轴选择

十一、Beautiful Soup

1 Beautiful Soup简洁

2 解释器

3 Beautiful Soup的基本使用

4 节点选择器

5 提取信息

5.1 获取名称

5.2 获取属性

5.3 获取内容

5.4 嵌套选择

5.5 关联选择

5.6 父节点和祖先节点

5.7 兄弟节点

5.8 提取信息

6 方法选择器

6.1 find_all方法

7 CSS选择器

7.1 嵌套选择

7.2 获取属性

7.3 获取文本

十二、pyquery

1 初始化

1.1 URL初始化

1.2 文件初始化

2 基本CSS选择器

3 查找节点

4 查找父节点

5 兄弟节点

6 遍历节点

7 获取信息

7.1 获取属性

7.2 获取文本

8 节点操作

8.1 add_class和remove_class方法

8.2 attr,text和html

8.3 remove方法

9 伪类选择器

十三、 parsel库

1 parsel简介

2 parsel初始化

3 匹配节点

4 提取文本

5 提取属性

6 正则提取

十四、总结


一、urllib

1、request简介

request是最基本的HTTP请求模块,可以模拟请求的发送,其过程与在浏览器中输入网址1然后回车一样,只要给库方法传入URL以及额外的参数,就可以模拟实现发送请求的过程。

1.1 urlopen

rullib.request模块可以模拟浏览器的请求发起过程,同时还具备处理授权验证(authentication)、重定向(redirection)、浏览器Cookie等功能。

基本写法如下:

import urllib.request
​
response = urllib.request.urlopen("https://www.python.org/")
print(response.read().decode('utf-8'))
 

该方法为GET请求方法。使用type方法得到响应的类型:

print(type(response))

输出:<class 'http.client.HTTPResponse'>

所以响应是一个HTTPResponse类型的对象。

使用方法输出响应的状态码和响应的头信息:

print(response.status) #得到响应的状态码
print(response.getheaders()) #得到响应的响应头信息
print(response.getheader("Server")) #获取响应头的键为Server的值

urlopen的API用法:

response = urllib.request.Request(url, data = None, [timeout]*,cafile = None,capath = None,cadefault = False,context = None)
1.2 data参数设计

data参数是可选的,在添加该参数时,需要使用bytes方法将参数转化为字节流编码格式的内容,即bytes类型。如果传递了data参数,则请求方方式为GET,而不是POST了。

实例:

import urllib.request
import urllib.parse
​
data = bytes(urllib.parse.urlencode({'name':'germey'}), encoding = 'utf-8')
response = urllib.request.urlopen('https://www.httpbin.org/post', data = data)
print(response.read().decode('utf-8'))

得到结果:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "name": "germey"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Content-Length": "11", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "www.httpbin.org", 
    "User-Agent": "Python-urllib/3.11", 
    "X-Amzn-Trace-Id": "Root=1-64997bdd-011711375cc64ba54dba4056"
  }, 
  "json": null, 
  "origin": "1.202.187.118", 
  "url": "https://www.httpbin.org/post"
}
​
​

则在data中设置的参数传递到form字段中,说明是模拟表达提交,即为POST方式传输数据。

1.3 timeout参数

timeout参数用于设置超时时间,单位为秒,意思是如果请求超过了这只的这个时间,但是还没有得到响应,就会抛出异常。如果不指定该参数,则会使用全局默认时间。timeout参数支持HTTP,HTTPS,FTP请求。

import socket
import urllib.request
import urllib.parse
import urllib.error
​
try:
    response = urllib.request.urlopen('https://www.httpbin.org/post', timeout=0.1)
except urllib.error.URLError as e:
    if isinstance(e.reason, socket.timeout):
        print("timeout")

输出timeout。

1.4 Request方法

urlopen可以发起最基本的请求,但是他的参数并不足以构建一个完整的请求。当需要往请求中加入Headers等信息时,就需要利用更加强大的Request类来构建请求。

例如:

import urllib.request
​
request = urllib.request.Request('https://www.mysql.com/cn/')
respence = urllib.request.urlopen(request)
print(respence.read().decode('utf-8'))

Request类的标准方法为:

class urllib.request.Request(url, data = None, headers = {}, origin_reg_host = None, unverifiable = False, method = None)

url:用于请求的URL,这是必传参数,其他为可选参数。

data:必须传递bytes参数,如果是字典,则可以使用urllib.parse中的urlencode方法进行编码

headers :传递一个字典,可以使用headers参数直接构造,也可以使用add_header方法添加。

origin_req_host:指的是请求方的host名称或者IP地址。

unverigiable:表示请求是否无法验证,默认值为False,意思为用户没有足够的权限来接受这个请求的结果。

method:这是一个字符串,表示用来请求使用的方法,例如GET,POST和PUT。

1.5 高级用户(Cookie、代理)

使用Handler类,Handler可以理解为各种处理器,使用Handler可以处理登录验证,处理Cookie,处理代理设置。urllib.request中有BaseHandler类,这是其他所有Handler的父类,以下几个子类可以作为基本的处理方式。

HTTPDefualtErrorHandler用于处理HTTP响应错误,所有错误都会抛出HTTPErroe类型的异常。

HTTPRedirectHandler用于处理重定向。

HTTPCookieProcessor用于处理Cookie。

ProxyHandler用于处理代理设置,代理默认为空。

HTTPPasswordMgr用于管理密码,它卫华着用户密码的对照表。

HTTPBasicAuthHandler用于管理认证,如果一个链接在打开时需要认证,那么可以用这个类来解决认证问题。

OpennerDirector类,可以作为Openor,提供open方法。

身份认证:
from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener
from urllib.error import URLError
​
username = 'admin'
password = 'admin'
url = 'https://ssr3.scrape.center/'
​
p = HTTPPasswordMgrWithDefaultRealm()
p.add_password(None, url,username, password)
auth_handler = HTTPBasicAuthHandler(p)
opener = build_opener(auth_handler)
​
try:
    restult = opener.open(url)
    html = restult.read().decode('utf-8')
    print(html)
except URLError as e:
    print(e.reason)

代理:
from urllib.error import URLError
from urllib.request import ProxyHandler, build_opener
​
proxy_handler = ProxyHandler({
    'http': 'http:/127.0.0.1:8080',
    'https': 'https://127.0.0.1:8080'
})
opener = build_opener(proxy_handler)
​
try:
    response = opener.open('https://www.baidu.com/')
    print(response.read().decode('utf-8'))
except URLError as e:
    print(e.reason)
Cookie:
import http.cookiejar, urllib.request
​
cookie = http.cookiejar.CookieJar()
​
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
reponse = opener.open('https://www.baidu.com')
​
for item in cookie:
    print(item.name + "=" + item.value)

将Cookie输出转化为文件格式,将CookieJar改为CookieJar的 子类MozillaCookieJar即可。

import urllib.request, http.cookiejar
​
filename = 'cookie.txt'
​
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('https://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)

使用子类LWPCookieJar同样可以保存Cookie,保存格式为LWP(libwww-perl)格式

import urllib.request, http.cookiejar
​
cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookie.txt',ignore_expires=True, ignore_discard=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
opener = opener.open('https://www.baidu.com')
print(opener.read().decode('utf-8'))

2、urllib——error模块

2.1 URLerror模块

URLerror类来自urllib库的error模块,继承自OSError类,是error异常模块的基类。其中的reason属性,返回错误的原因,例如:

from urllib import request,error
​
try:
    reponse = request.urlopen('https://cuiqingcai.com/404')
​
except error.URLError as e:
    print(e.reason)
2.2 HTTPError

HTTPError是URLError的子类,专门处理HTTP请求错误,它的属性有:

code:返回HTTP状态码,例如404表示网页不存在,500表示服务器内部错误。

reason:与URLerror一样,用于返回错误的原因

headers:返回请求头

例如:

from urllib import request,error
​
try:
    reponse = request.urlopen('https://cuiqingcai.com/404')
​
except error.HTTPError as e:
    print(e.code, e.reason,e.headers, sep='\n')

3、urllib——parse模块

urllib.parse模块定义了处理URL的标准接口,例如实现URL各部分的抽取,合并以及连接转化。它支持协议的URL处理: file,ftp,ogpher,hdl,http,https,imap,mailto,mms,news,nntp,prospero,rsync,rtsp,rtspu,sftp,sip,sips,snews,svn,svn+ssh,telnet和wais。

3.1 urlparse方法

urlparse可以实现RUL的识别和分段,例如:

result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
​
print(result)

结果:

ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')

urlparse有三个参数:

1、urlstring:这是必选参数,即待解析的URL。

2、scheme:这是默认的协议,例如https或者http,如果URL没有带有协议,则将这个协议作为默认的协议。

3、allow_fragments:是否忽略fragment,如果False,则fragments则会被忽略,会被解析为path、params或者query的一部分,而fragment则为空。

3.2 urlunparse方法

urlunparse用于构造URL,例如:

import urllib.parse
​
data = ['https','www.baidu.com','index.html','user','a=6','comment']
​
print(urllib.parse.urlunparse(data))

得到:百度一下,你就知道;user?a=6#comment

3.3 urlsplit方法

urlsplit与urlparse一样,都是用于解析URL,但是不再单独解析params这一部分,而是将params合并到path中,只返回5个结果。

3.4 urlunsplit方法

与urlunparse方法类似,将URL的各个部分组合为完成的链接。

3.5 urlencode方法

常常在构造GET请求参数时用到,参数为字典,可以将params序列转化为GET请求的URL的参数。

3.6 parse_qs方法

将一串GET请求参数转回字典。

3.7 parse_qsl方法

将参数转化为由元组组成的列表。

3.8 quote方法

将内容转化为URL编码的格式,用于当URL中有中文时,可能导致乱码的情况,则将中文部分转化为URL编码格式。

3.9 unquote方法

对URL的编码进行解码。

3.10 urljion
from urllib.parse import urljoin
help(urljoin)
Help on function urljoin in module urllib.parse:
​
urljoin(base, url, allow_fragments=True)
    Join a base URL and a possibly relative URL to form an absolute
    interpretation of the latter.

urljoin()是连接一个基本URL和一个可能的相对URL来形成一个绝对URL。那么,客观来说,base参数所代表的就是基本URL,url代表相对URL,最后的allow_fragments基本上不常用,它是是否忽略锚点的意思

4、urllib——robotparser模块

4.1 Robots协议

Robots Exclusion Protocol(网络爬虫排除标准),即Robots协议,也称为爬虫协议,机器人协议。用来告诉爬虫或者搜索引擎哪些网页可以抓取,哪些网页不可以抓取,通常是在一个叫做robots.txt的文本文件,一帮放在网站的根目录下。

4.2 爬虫名称

爬虫有固定的名称,例如:

BaiduSpider——百度

Googlebot——谷歌

360Spider——360搜索

YodaoBot——有道

ia_archiver——Alexa

Scooter——altavista

Bingbot——必应

4.3 robotparser

robotparser模块可以解析robots.txt文件,该模块提供了一个RobotFileParser类,可以根据某个网站的robots.txt文件判断一个爬取爬虫是否有权限爬取这个网页。使用这个类,只需要在构造方法里传入robots.txt文件的链接即可:

urllib.robotparser.RobotFileParser(url=""),也可以使用set_url()方法添加连接。

下列方法为RobotFileParser类的几个常用方法:

1、set_url:用来设置robots.txt文件的链接。

2、read:读取robots.txt文件并进行分析,这个方法执行读取和分析操作,如果不调用这个方法,接下来的判断都会为False。

3、parse:用来解析robots.txt文件,传入的参数是robots.txt文件中的某些行的内容,会按照robots.txt的语法规则来分析这些内容。

4、can_fetch:该方法有两个参数,第一个User_Agent,第二个是要抓取的URL,返回的结果是True或者False,表示User_Agent是否可以抓取URL。

5、mtime:返回上次抓取和分析robots.txt文件的时间,用于长时间分析和抓取robots.txt文件,定期检查以抓取最新的robots.txt文件

6、modified:可以将当前时间这是为上次抓取和分析robots.txt文件的时间。

二、 requests

1 request请求介绍

requests中的get(),post(),put(),delete(),patch()方法可以实现GET,POST,PUT,DELETE,PATCH请求。

2 GET请求

例如:

import requests
​
re = requests.get('https://www.httpbin.org/get')
print(re.text)
​
data = {
    'name': "germy",
    'age': "25"
}
​
re = requests.get(url='https://www.httpbin.org/get', params=data)
print(re.text)

可以使用params传递参数,返回结果为一个JSON格式的数据。

3、抓取网页信息

使用正则表达式抓取网页信息,例如:

import requests
import re
​
r = requests.get(url='https://ssr1.scrape.center/')
pattern = re.compile('<h2.*?>(.*?)</h2>', re.S)
titles = re.findall(pattern,r.text)
print(titles)

返回的是一个HTML文档:

['霸王别姬 - Farewell My Concubine', '这个杀手不太冷 - Léon', '肖申克的救赎 - The Shawshank Redemption', '泰坦尼克号 - Titanic', '罗马假日 - Roman Holiday', '唐伯虎点秋香 - Flirting Scholar', '乱世佳人 - Gone with the Wind', '喜剧之王 - The King of Comedy', '楚门的世界 - The Truman Show', '狮子王 - The Lion King']

4、抓取二进制数据

网页中,图片、音频、视频这些文件本质上都是由二进制码组成,但是由于有特定的保存格式和对应的解析方式,所以要抓取它们,就必须拿到它们的二进制数据。

以抓取图标为例:

import requests
​
response = requests.get(url='https://scrape.center/favicon.ico')
print(response.text)
print(response.content)

text在打印时是直接转化为str类型,而content则会输出bytes类型数据,可以将content以二进制的方式写入文件,即可看见爬取的图标:

import requests
​
response = requests.get(url='https://scrape.center/favicon.ico')
#print(response.text)
#print(response.content)
​
with open('favicon.ico', 'wb') as f:
    f.write(response.content)

得到图片为:

5、添加请求头

请求头以字典的方式添加,直接放在get方法中的headers参数:

 
import requests
​
headers = {
    'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                 "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.58"
}
​
reponse = requests.get(url='https://gw.alicdn.com/imgextra/i3/O1CN01uRz3de23mzWofmPYX_!!6000000007299-2-tps-143-59.png',
                       headers=headers)
print(reponse.text)
​
with open('picture1.png','wb') as f:
    f.write(reponse.content)

6 POST请求

将GET换位POST,即可完成POST请求:

import requests
​
data = {
    'name': 'germey',
    'age' : '25'
}
​
response = requests.post(url='https://www.httpbin.org/post', data=data)
print(response.text)

7 响应

使用方法得到响应的状态码,响应头,Cookie等:

import requests
​
response = requests.get(url='https://ssr1.scrape.center/')
print(type(response.status_code), response.status_code)
print(type(response.headers),response.headers)
print(type(response.cookies),response.cookies)
print(type(response.url),response.url)
print(type(response.history),response.history)

history得到请求历史。

8 上传文件

requests.post中的file参数可用于上传文件:

import requests
​
files = {'file': open('favicon.ico','rb')}
response = requests.post(url='https://www.httpbin.org/post', files=files)
print(response.text)

9 Cookie设置

使用cookies属性直接获取cookie:

import requests
​
response = requests.get(url='https://www.baidu.com')
print(response.cookies)
for key, value in response.cookies.items():
    print(key + '=' + value)

<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]> BDORZ=27315

可以看出,Cookie是一个RequestsCookieJar类型的数据。

访问GitHub:

import requests
​
​
headers = {
    'Cookie' : '_octo=GH1.1.1952410655.1687965630; _device_id=7abb2eed2a3bc9c7ccdd9c50dc72c733; preferred_color_mode=light; tz=Asia%2FShanghai; has_recent_activity=1; user_session=2AuvTS3iXnnwjKJhxdv8P51QcoDaV3BfEdDWvBfqaDRQdSTy; __Host-user_session_same_site=2AuvTS3iXnnwjKJhxdv8P51QcoDaV3BfEdDWvBfqaDRQdSTy; tz=Asia%2FShanghai; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_in=yes; dotcom_user=LOVELONGZHICHENG; _gh_sess=58%2Fhf7MZ4nt7Bb9y4U0OZLhFH5psxb%2ByZuvBogQL3VcDnRcvuIqh4E8rWByk15hH1M%2FoigRknRX5NlJd3PTGDhieA5zExfzszBAcM948IIhhmgJ5W%2FbYd5Z64lpkkXoPsbku%2Bk7s0UPXnyBWyM1hzDEnI2g8LiZLXrQvzPdU03QK2z5slTut9SQfNUywdd6vlZ9yHH8jHfKvBZ4wQcA9wBFKKWvxEh1IPwa%2F7sMByaESCw%2Fzy%2FR5Akt8dCRXcYVrLRD2pbXOTc%2FcSUSboB45OfuSD%2BDuj6oueKUBVuDsP8gdQwLLAlfcHoInOg3bUWrSupVz8nG6H0DVwkp7OoAlmpUGCDiNRPlwXCIDknEenvKSjEL1HeSoxFh3UI2sSwKWs9J8IatjB2atqes3QNQiPL85FJypNNiDrXrOKOP8RHJa90gATMSRpLTJNocTE62kekCgTlcc%2BOmmSPAmuv4d8Q2wu2FpxBlMAtBN2%2B67u%2F6Makr6C3p3MvLcfy0n4jyfEWrex5Fq%2BMmpNekYPOftuFcbXcxbOJ6ZHDKWVhb7eCdkfNcma8m9H8Cz9qFSZ6pQxJb7cdTAzLdK1xR4Ge6r%2FRN1MwV2sRdjzdk2whwUEAPWOYL1XPHylNm5qSBKMZgx5AwUre8%2FTTjnpr06XLHPg0ebthcQyMeM0z3u9p7GIjYWzeD9k3d8%2B%2Fpoq7sz714yMpE23cjjC9ddN8ZCzti81KvPX9sb0OPxc2bDad8uieFVP5xS6dRuydyp9BWzhykL%2FxCMATXkrgGP6yk4FsXFQ0WqUWaqBeqnd%2Bwqvm6RMcPdOC4lo25XvCe42ClugKpqeLSJy5Jjar9mWaMl%2BIpTMHMqyCqPn%2FfQQ1Jwr%2FG%2FZCeZKsFYChusB8i9Jvj7QWXDn%2FVkg4HO%2B8XuASqK5juz5YemXGan8xaT6ZqTuk6eS7Zs--ii24y6hhQk9QCx7J--hdykK82UD%2F0I6uCBWqWE4Q%3D%3D',
    'Connection': 'close'
​
}
response = requests.get(url='https://github.com/',headers=headers)
print(response.text)
print(response.cookies)
for key, value in response.cookies.items():
    print(key + '=' + value)

'Connection': 'close'为不使用持久连接。

10 session维持

使用POST和GET请求相当于使用两个浏览器打开了两个不同的页面,但是当我们需要打开同一个页面时,要么设置同一个Cookie,但是这样做过于繁琐。为了解决这一问题,只需维护同一个session即可,也就是第二次访问时打开新的浏览器选项卡不是打开新的浏览器,使用Session对象,就可以不用重新设置Cookie,具体如下:

首先先请求一个网站,设置一个Cookie,然后再次请求:

import requests
​
requests.get(url = 'https://www.httpbin.org/cookies/set/number/123456789') #设置Cookie
response = requests.get(url='https://www.httpbin.org/cookies')
print(response.text)

发现不能获取Cookie。

而当使用Session对象:

import requests
​
s = requests.Session()
​
s.get(url = 'https://www.httpbin.org/cookies/set/number/123456789') #设置Cookie number #123456789
response = s.get(url='https://www.httpbin.org/cookies')
print(response.text)

即可获得相应设置的Cookie信息

11 SSL证书认证——verify参数

现在的网站大多要求使用HTTPS协议,但是有网站可能并没有设置好HTTPS证书,或者网站的HTTPS证书可能并不被CA机构认可,这时这些网站就可能出现SSL证书错误的提示。如果直接访问这些网站 ,那么可能会出现“您的连接并不是私密连接”的错误提醒,则需要再浏览器中通过一些设置来忽略证书的验证。可以使用verify参数来控制是否验证证书,如果设置为False,那么在请求时就不会再验证证书是否有效;如果设置为True,则会自动进行验证。

例如:

import requests
​
response = requests.get(url='https://ssr2.scrape.center/')
print(response.status_code)

抛出self signed certificate (_ssl.c:992)')))——SSLError错误

则在请求时设置不用证书认证:

import requests
​
response = requests.get(url='https://ssr2.scrape.center/',verify=False)
print(response.status_code)

则会跳出警告,但是输出200,表示成功请求。

若要忽略警告,则可以导入urllib3来设置忽略警告:

import requests
import urllib3
​
urllib3.disable_warnings()
response = requests.get(url='https://ssr2.scrape.center/',verify=False)
print(response.status_code)

这个时候就没有警告了。

也可以通过捕获警告道日志的方式忽略警告:

import requests
import urllib3
import logging
​
#urllib3.disable_warnings()
logging.captureWarnings(True)
response = requests.get(url='https://ssr2.scrape.center/',verify=False)
print(response.status_code)

第三种方法可以通过get方法传入本地的证书:

import requests
import urllib3
import logging
​
#urllib3.disable_warnings()
logging.captureWarnings(True)
response = requests.get(url='https://ssr2.scrape.center/',cert=('/path/server.crt','/path/server.key'))
print(response.status_code)

需要有crt文件和key文件,并且key文件必须是解密状态。

12 超时设置

requests.get()中也可以设置超时时间timeout,单位为秒:

请求分为连接(connect)和读取(read)两个部分。

import requests
​
response = requests.get(url='https://www.httpbin.org/get', timeout=1) #设置整个请求的时间
​
response = requests.get(url='https://www.httpbin.org/get', timeout=(5,30))#分别设置连接connect和读取read的时间

13 身份验证

若要访问启用了身份验证的网页,则可以通过requests自带的身份验证功能,通过auth参数设置即可,用法如下:

import requests
import urllib3
from requests.auth import HTTPBasicAuth
​
urllib3.disable_warnings()
auth = HTTPBasicAuth('17807882078','623623ll')
response = requests.get(url='https://www.saikr.com/login', auth=HTTPBasicAuth('admin','admin'),verify=False)
print(response.status_code)
​
response = requests.get(url='https://www.saikr.com/login', auth=auth,verify=False)
print(response.status_code)
​
response = requests.get(url='https://www.saikr.com/login', auth=('账号','密码'),verify=False)
print(response.status_code)
print(response.text)

requests也可以使用其他认证方式,如OAuth认证,则需要下载oauth包:

14 代理设置——proxies

使用proxies设置代理:

import requests
​
proxies = {
    'http': 'http://127.0.0.1:1080',
    'https' : 'http://127.0.0.1:1080'
}
​
response = requests.get(url='https://www.jd.com/?cu=true&utm_source=baidu-search&utm_medium=cpc&utm_campaign=t_262767352_baidusearch&utm_term=304790549298_0_3ba2c5425c4f4517a9a1e54f49596db9',proxies=proxies)
print(response.status_code)

15 Prepared Request

requests在发送请求时,其实是构造了一个Request对象,赋各种参数之后然后发送出去,具体过程如下:

from requests import Request, Session
​
url = 'https://www.httpbin.org/post'
data = {'name': 'germey'}
headers = {
    'User_Agent': ''
}
​
s = Session()
​
req = Request('POST',url=url,headers=headers,data=data)
prepped = s.prepare_request(req)
response = s.send(prepped)
print(response.text)

三、正则表达式

正则表达式是用来处理字符串的强大工具,它有自己特定的语法结构,能够实现字符串的检索,替换,匹配验证等。

1 常用正则表达式的匹配规则

可以使用在线正则表达式测试 (oschina.net)开源网页进行正则表达式匹配:

\w : 匹配字母、数字以及下划线

\W : 匹配不是字母,数字以及下划线的字符

\s : 匹配任意空白字符,等价于[\t\n\r\f]

\S : 匹配任意非空白字符

\d : 匹配任意数字,等价于[0-9]

\D : 匹配任意非数字的字符

\A : 匹配字符串开头

\Z : 匹配字符串结尾。如果存在换行,只匹配到换行前的结束字符串。

\z : 匹配字符串结尾,如果存在换行,同时还会匹配换行符

\G : 匹配最后匹配完成的位置。

\n : 匹配一个换行符。

\t : 匹配一个制表符

^ : 匹配一行字符串的开头。

$ : 匹配一行字符串的结尾。

. : 匹配任意字符,除了换行符,让re.DOTALL标记被指定时,可以匹配包括换行符的任意字符。

[...] : 用来表示一组字符,例如[amk]用来匹配a,m,k。

[^...] : 匹配不在[]中的字符,例如匹配除了a,b,c之外的字符。

* : 匹配0个或多个表达式。

+ :匹配1个或者多个表达式。

? : 匹配0个或1个前面的正则表达式定义的片段,非贪婪方式。

{n}: 精确匹配n个前面的表达式。

{n,m}: 匹配n到m次由前面正则表达式定义的片段,贪婪方式。

a|b : 匹配a或b

(): 匹配括号内的表达式,也表示是一个组。

python的re库提供了整个正则表达式的实现。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值