爬虫基础学习笔记


urllib库

urllib库是Python中的一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。

1、urlopen函数

在Python3的urllib库中,所有和网络请求相关的方法,都在urllib.request模块下面,urlopen函数的基本使用,urlopen()函数语法格式如下:

request.urlopen(url, data=None, [timeout,]*, cafile=None, capath=None, cadefault=False, context=None)
from urllib import request# 一种写法
resp = request.urlopen('http://www.baidu.com/')
# 另一种写法
url = 'http://www.baidu.com/'
resp = request.urlopen(url=url)# 读取所有内容
print(resp.read())
# 读取10个字符
print(resp.read(10))
# 读取一行
print(resp.readline())
# 读取多行
print(resp.readlines())
# 获取状态码
print(resp.getcode())

下面对urlopen函数进行详细讲解:

(1)url : 请求的url

(2)data:请求的data,如果设置了这个值,那么将变成POST请求

(3)返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline、readlines及getcode 等方法。

2、urlretrieve函数

这个函数可以方便的将网页上的一个文件保存到本地,以下代码可以非常方便的将百度首页下载到本地:

from urllib import request
# 此函数语法必须严格这么写,下载文件名:baidu.html,存到当前路径
request.urlretrieve('http://www.baidu.com/', 'baidu.html')
# 如果这样向如下这么写,不可以
url = 'http://www.baidu.com/'
request.urlretrieve(url=url, 'baidu.html')# 会有如下的报错request.urlretrieve(url=url, 'baidu.html')^
SyntaxError: positional argument follows keyword argument

下面例子是保存一个图片到本地:

from urllib import request# 防止验证错误
import ssl
ssl._create_default_https_context = ssl._create_unverified_contextrequest.urlretrieve('https://tenfei03.cfp.cn/creative/vcg/800/new/VCG21a1834bfe5.jpg', '1.jpg')

3、urlencode函数

真实浏览器发送请求的时候,如果url中包含了中文或者其他特殊字符,那么浏览器会自动的给我们进行解码。但如果使用代码发送请求时,那么就要手动编码,这样就用到urlencode函数。urlencode可以把字典数据转换成url编码的数据。示例代码如下:

# parse 跟解析相关
from urllib import parse
data = {'name':'爬虫基础', 'year': 2022, 'add': '吉林白城'}
qs = parse.urlencode(data)
print(qs)

如果我们在代码里用不编码的格式发送请求,示例代码如下:

from urllib import request
url = 'https://www.baidu.com/s?wd=李小龙'
resp = request.urlopen(url)
print(resp.read())

错误如下:

UnicodeEncodeError                        Traceback (most recent call last)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-12: ordinal not in range(128)

对照一下,现在把‘李小龙’进行urlencode编码,然后进行代码请求,代码如下:

from urllib import request
from urllib import parseurl = 'https://www.baidu.com/s?'
data = {'wd':'李小龙'}
params = parse.urlencode(data)
url = url+params
resp = request.urlopen(url)
print(resp.read())

正常响应,返回结果如下图:

4、parse_qs函数

可以将经过编码后的url参数进行解码,示例代码如下:

from urllib import parse
qs='name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&year=2022&add=%E5%90%89%E6%9E%97%E7%99%BD%E5%9F%8E'
print(parse.parse_qs(qs))

解码出来的依然是字典格式,但是值变成列表了。

5、urlparse和urlsplit

有时候要对一个url中的各个组成部分进行分割,这时候需要urlparse或者urlsplit来进行分割。代码如下:

from urllib import request, parse
url = 'http://www.baidu.com/s?wd=java&username=123#23'res = parse.urlparse(url)
print(res)

解析:scheme对应http,netloc 对应www.baidu.com, path对应/s,?查询语句对应query=,fragement对应#

若获取莫一个属性值,示例代码如下:

from urllib import request, parse
url = 'http://www.baidu.com/s?wd=java&username=123#23'res = parse.urlparse(url)
print('scheme:', res.scheme)
print('netloc:', res.netloc)
print('path:', res.path)
print('params:', res.params)
print('query: ', res.query)
print('fragment:', res.fragment)
# 结果
scheme: http
netloc: www.baidu.com
path: /s
params:
query:  wd=java&username=123
fragment: 23

urlsplit应用,示例代码如下:

from urllib import request, parse
url = 'http://www.baidu.com/s?wd=java&username=123#23'res = parse.urlsplit(url)print(res)
print('scheme:', res.scheme)
print('netloc:', res.netloc)
print('path:', res.path)
# print('params:', res.params)
print('query: ', res.query)
print('fragment:', res.fragment)
SplitResult(scheme='http', netloc='www.baidu.com', path='/s', query='wd=java&username=123', fragment='23')
scheme: http
netloc: www.baidu.com
path: /s
query:  wd=java&username=123
fragment: 23

二者区别:urlsplit没有params属性,urlparse有params属性,如果在url的‘s’与‘?’之间添加一个数据那么urlparse解析就会有paramas=数据值


request.Request类

首先运行一下不加headers头的访问方法,示例代码如下:

from urllib import request
url = 'https://www.lagou.com/wn/jobs?labelWords=&fromSearch=true&suginput=&kd=python'
resp = request.urlopen(url)
print(len(resp.read()))
executed in 707ms, finished 12:47:22 2022-01-23
127034

如果想要在请求的时候增加一些请求头,那么就必须使用request.Request类来实现。比如要增加一个User-Agent,示例代码如下:

from urllib import request
url = 'https://www.lagou.com/wn/jobs?labelWords=&fromSearch=true&suginput=&kd=python'
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'}# 用request.Request类实例化一个req请求对象
req = request.Request(url, headers=headers)# 然后用request.urlopen()打开这个请求对象
resp = request.urlopen(req)
print(len(resp.read()))
executed in 788ms, finished 12:47:42 2022-01-23
124447

ProxyHandler处理器(代理设置)

很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不正常,它会禁止这个IP访问。所以我们可以设置一些代理器,每隔一段时间换一个代理,就算IP被封,依然可以换个IP继续爬取。urllib中通过ProxyHandler来设置使用代理服务器,下面代码说明如何使用自定义opener来使用代理:

from urllib import request# 无代理
resp = request.urlopen('http://httpbin.org/get')
print(resp.read().decode('utf-8'))# 使用代理,格式是字典,代理支持http,键就是http,支持https,键就是https,值就是代理服务器的ip
handler = request.ProxyHandler({'http':'218.66.161.88:31769'})opener = request.build_opener(handler)
req = request.Request('http://httpbin.org/ip')
resp = opener.open(req)
print(resp.read())

使用代理的请求结果如下:

b'<!DOCTYPE html>\r\n<html>\r\n\r\n<head>\r\n    <meta charset="UTF-8" />\r\n    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />\r\n    <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no" />\r\n    <meta name="apple-mobile-web-app-title" content="\xe4\xba\xac\xe4\xb8\x9c\xe8\xb7\xaf\xe7\x94\xb1" />\r\n    <meta http-equiv="pragma" content="no-cache">\r\n    <meta http-equiv="cache-control" content="no-cache">\r\n    <meta http-equiv="expires" content="0">\r\n    <title>JD</title>\r\n    <link href="./P_IMG/icon.png" rel="icon" type="image/x-icon" />\r\n    <script type="text/Javascript" src="./Public_JS/jquery.min.js"></script>\r\n    <script type="text/Javascript" src="./Public_JS/redirect.js"></script>\r\n    <script type="text/Javascript" src="./Public_JS/jquery.cookie.js"></script>\r\n</head>\r\n\r\n<body>\r\n    <div id="main"></div>\r\n</body>\r\n<script type="text/Javascript">\r\n    var errNo = 0;\r\n    $(function () {\r\n        var DEFAULT_VERSION = 9.0;\r\n        var ua = navigator.userAgent.toLowerCase();\r\n        var isIE = ua.indexOf("msie") > -1;\r\n        var safariVersion;\r\n        if (isIE) {\r\n            safariVersion = ua.match(/msie ([\\d.]+)/)[1];\r\n        }\r\n        if (safariVersion <= DEFAULT_VERSION) {\r\n            alert(\'\xe7\xb3\xbb\xe7\xbb\x9f\xe6\xa3\x80\xe6\xb5\x8b\xe5\x88\xb0\xe6\x82\xa8\xe6\xad\xa3\xe5\x9c\xa8\xe4\xbd\xbf\xe7\x94\xa8ie9\xe5\x8f\x8a\xe4\xbb\xa5\xe4\xb8\x8b\xe5\x86\x85\xe6\xa0\xb8\xe7\x9a\x84\xe6\xb5\x8f\xe8\xa7\x88\xe5\x99\xa8\xef\xbc\x8c\xe4\xb8\x8d\xe8\x83\xbd\xe5\xae\x9e\xe7\x8e\xb0\xe5\xae\x8c\xe7\xbe\x8e\xe4\xbd\x93\xe9\xaa\x8c\xef\xbc\x8c\xe8\xaf\xb7\xe6\x9b\xb4\xe6\x8d\xa2\xe6\x88\x96\xe5\x8d\x87\xe7\xba\xa7\xe6\xb5\x8f\xe8\xa7\x88\xe5\x99\xa8\xe8\xae\xbf\xe9\x97\xae\xef\xbc\x81\')\r\n        };\r\n\r\n        var htmlHref = window.location.href;\r\n        htmlHref = htmlHref.replace(/^http:\\/\\//, "");\r\n        var index = htmlHref.indexOf(\'/\');\r\n        htmlHref = htmlHref.substring(0, index);\r\n        $.cookie("HostAddrIP", htmlHref, {\r\n            expires: 7, path: \'/\'\r\n        });\r\n        $.ajax({\r\n            type: "post",\r\n            url: "http://" + htmlHref + "/jdcapi",\r\n            data: JSON.stringify({\r\n                "jsonrpc": "2.0",\r\n                "id": 20,\r\n                "method": "call",\r\n                "params": [\r\n                    "00000000000000000000000000000000",\r\n                    "jdcapi.static",\r\n                    "get_initialization_info",\r\n                    {}\r\n                ]\r\n            }),\r\n            dataType: "json",\r\n            success: function (data) {\r\n                if(data.result[0] == 0 && data.result[1].intialized == \'1\'){\r\n                    if (browserRedirect()) { \r\n                        window.location.href = "./M_Guide/html/M_Login.html";\r\n                    } else \r\n                    { \r\n                        window.location.href = "./P_Guide/html/P_Login.html"; \r\n                    }\r\n                }else{\r\n                    initUserLogin(htmlHref);\r\n                    if(errNo){\r\n                        if (browserRedirect()) { window.location.href = "./M_Guide/html/M_Welcome.html";} else { window.location.href = "./P_Guide/html/P_Welcome.html"; }\r\n                    }else{\r\n                        alert(\'\xe7\xb3\xbb\xe7\xbb\x9f\xe9\x94\x99\xe8\xaf\xaf\xef\xbc\x8c\xe8\xaf\xb7\xe9\x87\x8d\xe8\xaf\x95\');\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        \r\n    });\r\n    var initUserLogin = function (htmlHref) {\r\n        $.ajax({\r\n            type: "post",\r\n            url: "http://" + htmlHref + "/jdcapi",\r\n            async:false,\r\n            data: JSON.stringify({\r\n                "jsonrpc":"2.0",\r\n                "id":1,\r\n                "method":"call",\r\n                "params":[\r\n                    "00000000000000000000000000000000",\r\n                    "session",\r\n                    "login",\r\n                    {\r\n                        "username": "root",\r\n                        "password": "admin",\r\n                        "timeout":0\r\n                    }\r\n                ]\r\n            }),\r\n            dataType: "json",\r\n            success: function (data) {\r\n                if(data.result[0] == 0){\r\n                    errNo = 1;\r\n                    $.cookie("sessionid", data.result[1].ubus_rpc_session, {\r\n                        expires: 7, path: \'/\'\r\n                    });\r\n                }else{\r\n                    errNo = 0;\r\n                }\r\n            }\r\n        });\r\n    };\r\n  </script>\r\n\r\n</html>'

常用的代理有

•快代理:http://www.kuaidaili.com/

•代理云:http://www.dailiyun.com/

不使用代理访问:

from urllib import requesturl = 'http://httpbin.org/ip'
resp = request.urlopen(url)
print(resp.read())
executed in 544ms, finished 19:51:12 2022-01-23
b'{\n  "origin": "222.163.139.128"\n}\n'

使用代理访问:

1、使用ProxyHandler,传入代理构建的一个handler

2、使用创建的handler构建一个opener

3、使用opener发送一个请求

 from urllib import requesturl = 'http://httpbin.org/ip'
# 使用ProxyHandler,传入代理构建的一个handler
handler = request.ProxyHandler({'http':'122.226.57.50:8888'})
# 使用创建的handler构建一个opener
opener = request.build_opener(handler)
# 使用opener发送一个请求
resp = opener.open(url)
print(resp.read())

结果如下:

executed in 698ms, finished 20:04:30 2022-01-23
b'{\n  "origin": "122.226.57.70"\n}\n'

总结:

1、代理的原理:在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到目的网站的数据后,再转发给我们的代码。

2、http://httpbin.org:这个网站可以方便的查看http请求的一些参数。格式如下:

http://httpbin.org/get
http://httpbin.org/user-agent
http://httpbin.org/ip

3、在代码中使用代理:

​ • 使用‘url lib.request.ProxyHandler’传入一个代理,这个代理是一个字典,字典的key是‘http’或者’https’

​ • key依赖于代理服务器能够接受的类型,value是:‘ip:port’,然后使用创建的’handler’以及request.build_opener’创 建一个’opener’。

​ • 使用创建的’opener’,调用’open’函数,发送请求。

什么是cookie

在网站中,http请求是无状态的,也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求的是谁。cookie的出现就解决了这个问题,第一次登录服务器后返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求时候,就会自动把上次存储的cookie数据自动携带给服务器,服务器通过浏览器携带的数据能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB,因此使用cookie只能存储一些小量的数据。

cookie的格式:

Set-Cookie:NAME=VALUE; Expires/Max-age = DATE; Path=PATH;Domain=DOMAIN_NAME;SECURE

参数意义:

• NAME:cookie的名字

• VALUE:cookie的值

• Expires:cookie的过期时间

• Path:cookie作用的路径

• Domain:cookie作用的域名

• SECURE:是否只在https协议下起作用。

使用cookielib库和HTTPCookieProcessor模拟登录

Cookie是指网站服务器为了辨别用户身份和进行Session跟踪,而存储在用户浏览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器会话。下面以登录人人网为例,要访问某个人的主页,必须先登录才能访问,也就是说登录就要有cookie信息。那么我们那想用代码的方式访问,就必须要有正确的cookie信息才能访问。解决方案两种,第一种是使用浏览器访问,然后将cookie信息复制下来,放到headers中。示例代码如下:

from urllib import request# 在浏览器地址栏输入http://httpbin.org/user-agent即可获得headers里的User-Agent
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36", 'Cookie':'taihe_bi_sdk_uid=1034eaf8795b3aa571215b0229493246; taihe_bi_sdk_session=74f6c86d2578f7944791f18bc8de8141; Hm_lvt_ad6b0fd84f08dc70750c5ee6ba650172=1642950134,1642950199,1642990773; LOCAL_STORAGE_KEY_RENREN_USER_BASIC_INFO={"userName":"Bruce_liu","userId":2147694583,"headUrl":"http://rrfmn.rrimg.com/","secretKey":"32d3ccb0d3f81e9bfec587d6b2b8074c","sessionKey":"g1c1iAHmWq1VXPxR"}; Hm_lpvt_ad6b0fd84f08dc70750c5ee6ba650172=1642990794' }
# 不使用cookie去请求个人主页(Bruce_liu)本人的个人主页
url = 'http://www.renren.com/personal/2147694583'req = request.Request(ul=url, headers=headers)
resp = request.urlopen(req)
with open('renren.html', 'w') as fp:# write函数必须写入一个str的数据类型# resp.read()读出来的是一个bytes数据类型# bytes -> decode -> str# str -> encode ->bytesfp.write(resp.read().decode('utf-8'))

http.cookiejar模块

该模块主要的类有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。四个类的作用分别如下:

1、CookieJar:管理HTTPcookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。

2、FileCookieJar(filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。

3、MozillaCookieJar(filename,delaylod=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器cookies.txt兼容的FileCookieJar实例。

4、LWPCookieJar(filename,delayload=None, polciy=None):从FileCookieJar派生而来,创建与libwww.perl标准的Set-Cookie3文件格式兼容的FileCookieJar实例。

利用http.cookiejar和request.HTTPCookieProcessor登录人人网,示例代码如下:

from urllib import request
from urllib import parse
from http.cookiejar import CookieJarheaders = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"}# 定义一个返回opener的函数
def get_opener():# 登录# 创建一个cookiejar对象cookiejar = CookieJar()# 使用cookiejar创建一个HTTPCookieProcessor对象handler = request.HTTPCookieProcessor(cookiejar)# 使用上一步创建的handler创建一个openeropener = request.build_opener(handler)return opener# 定义一个登录人人网函数
def login_renren(opener):    # 使用opener发送登录的请求(人人网邮箱和密码)data = {'email': '11343154@qq.com','password': '2008-lxw'}login_url = 'http://www.renren.com/personal/2147694583'req = request.Request(login_url, data=parse.urlencode(data).encode('utf-8'), headers=headers)opener.open(req)# 定义一个访问个人主页函数
def vist_profile(opener):# 访问个人主页bruce_liu_url = 'http://www.renren.com/personal/2147694583'# 获取个人主页的页面的时候,不用新建一个opener# 因为之前那个opener已经包含了登录需要的cookie信息req = request.Request(bruce_liu_url, headers=headers)resp = opener.open(req)with open('renren2.html', 'w', encoding='utf-8') as fp:fp.write(resp.read().decode('utf-8'))if __name__=='__main__':opener1 = get_opener()login_renren(opener1)vist_profile(opener1)

保存cookie到本地

保存cookie到本地,可以使用cookiejar的save方法,并且需要指定一个文件名。


from urllib import request
from http.cookiejar import MozillaCookieJar                   headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS
# 先生成cookie小罐
cookiejar = MozillaCookieJar('cookie.txt')
# 利用cookie小罐生成句柄handler
handler = request.HTTPCookieProcessor(cookiejar)
# 利用handler生成opener
opener = request.build_opener(handler)                        req = request.Request('http://www.baidu.com/cookies/set/course/spider', headers=headers)resp = opener.open(req)
# print(resp.read())
cookiejar.save(ignore_discard=True, ignore_expires=True)

那么加载本地cookie,代码如下:

from urllib import request
from http.cookiejar import MozillaCookieJar
import  ssl
ssl._create_default_https_context=ssl._create_unverified_context
headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"}
# 先生成cookie小罐
cookiejar = MozillaCookieJar('cookie.txt')
# 利用load()函数,参数设置为ignore_discard=True
cookiejar.load(ignore_discard=True)
# 利用cookie小罐生成句柄handler
handler = request.HTTPCookieProcessor(cookiejar)
# 利用handler生成opener
opener = request.build_opener(handler)resp = opener.open('http://httpbin.org/cookies')
for cookie in cookiejar:print(cookie)

requests库

虽然Python的标准库中urllib模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人感觉比较繁琐,而Requests的宣传是“HTTP for Humans",说明使用更简洁方便。

安装和文档地址:

利用pip可以非常方便安装

pip install requests

gihut地址:https://github.com/requests/requests

发送GET请求

1、最简单的发送get请求就是通过requests.get来调用

import requests
url = 'http://www.baidu.com/'
resp = requests.get(url)

2、添加headers和查询参数,如果要添加headers,可以传入headers参数来增加请求头中的headers信息。如要将参数放在url中传递,可以利用params参数。示例代码如下:

import requests
kw = {'wd': 'python'}
headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
}# params接收一个字典或字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
resp = requests.get('http://www.baidu.com/s', params=kw, headers=headers)# 查看响应内容,response.text返回的是unicode格式数据
print(resp.text)# 查看响应内容,resp.content返回的字节数据
print(resp.content)# 查看完整url地址
print(resp.url)# 查看响应头部字符编码
print(resp.encoding)# 查看响应码
print(resp.status_code)# 如果把响应内容解码写成html文件
with open('baidu.html', 'w', encoding='utf-8') as fp:fp.write(resp.content.decode('utf-8'))

response.text和response.content的区别

  1. response.content:这个是直接从网络上面抓取的数据,没有经过任何编码,所以是个bytes类型。在硬盘和网络上传输的字符串都是bytes类型。
  2. response.text:这个是requests,将response.content进行解码的字符串。解码需要指定一个编码方式,requests会根据自己的猜测来判断编码的方式。所以有时间可能会猜测错误,就会导致解码产生乱码。这时候应该使用"response.content.decode(‘utf-8’)"进行手动解码。

发送POST请求

1、最基本的POST请求可以使用post方法,若返回的是json数据,那么可以调用‘response.json()‘来将json字符串转换为字典或者列表。

response = requests.post('http://www.baidu.com/', data=data)

2、传入data数据

这时候就不要再使用urlencode进行编码了,直接传入一个字典进去就可以了。比如请求拉勾网的数据的代码:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :1/24/22 6:06 PM
# 文件      :post.py
# IDE      :PyCharmimport requestsurl = 'https://www.lagou.com/jobs/position'
headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
}data = {'first':'true','pn':1,'kd':'python'
}resp = requests.post(url, headers=headers, data=data)# 如果是json数据,直接可以调用json方法
print(resp.json())

GE T请求和POST请求区别

get 请求参数为params=, post请求为data=

使用代理

使用requests添加代理也非常简单,只要在请求方法中(比如get或者post)传递proxies参数就可以,示例代码如下:

import requestsurl = 'http://httpbin.org/get'headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
}proxy = {'http':'61.150.96.27:36880'  # https://www.kuaidaili.com/free/inha/3/ 陕西汉中电信
}resp = requests.get(url, headers=headers, proxies=proxy)
with open('xx.html', 'w', encoding='utf-8') as fp:fp.write(resp.text)结果如下:
{ "args": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36", "X-Amzn-Trace-Id": "Root=1-61eea7d1-0f1dae897b843858628d2d7e" }, "origin": "61.150.96.27", "url": "http://httpbin.org/get" }

测试代理IP,结果如下图:

cookie

如果在一个响应中包含了cookie,那么利用cookies属性拿到这个返回的cookie值:

import requestsurl = 'http://www.renren.com/PLogin.do'
data = {'emai':'970138074@qq.com', 'password':'pythonspider'}
resp = requests.get('http://www.baidu.com/')
print(resp.cookies)
print(resp.cookies.get_dict())

结果如下:

executed in 102ms, finished 21:51:15 2022-01-24
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
{'BDORZ': '27315'}

session

之前使用urllib库,可以使用opener发送多个请求,多个请求之间是可以共享cookie的。那么如果使用requests,也要达到共享cookie的目的,那么可以使用requests库给我们提供的session对象。注意,这里的session不是web开发中的那个session,这个地方知识一个会话的对象而已。下面以人人网为例,使用requests实现,示例代码如下:

import requestsurl = 'http://www.renren.com/PLogin.do'
headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
}data = {'emai':'970138074@qq.com', 'password':'pythonspider'}
session = requests.Session()
session.post(url, data=data, headers=headers)resp = session.get('http://www.renren.com/880151247/profile')with open('renren.html', 'w', encoding='utf-8') as fp:fp.write(resp.text)

处理不信任的SSL证书

对于那些已经不信任的SSL证书的网站,比如:https://www.baidu.com/,那么使用requests直接就可以正常返回响应。示例代码如下:

resp = requests.get(url,verify=False)  # verify设置False

爬虫基础_urllib相关推荐

  1. 爬虫基础(一)之概念、作用、分类和流程

    爬虫基础(一)之概念.作用.分类和流程 1. 爬虫的概念 模拟浏览器,发送请求,获取响应        浏览器相当于客户端 网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟客户端(如网易云音乐)(主要 ...

  2. python 使用socks 爬虫_python爬虫基础之urllib的使用

    这篇文章主要介绍了python爬虫基础之urllib的使用,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下 一.urllib 和 urllib2的关系 在python2中,主要使用url ...

  3. java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识

    原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...

  4. python基础代码库-python爬虫基础教程:requests库(二)代码实例

    get请求 简单使用 import requests ''' 想要学习Python?Python学习交流群:973783996满足你的需求,资料都已经上传群文件,可以自行下载! ''' respons ...

  5. python基础知识整理-python爬虫基础知识点整理

    首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 根据我的经验,要学习Python爬虫 ...

  6. Hadoop综合大作业补交4次作业:获取全部校园新闻,网络爬虫基础练习,中文词频统计,熟悉常用的Linux操作...

    1.用Hive对爬虫大作业产生的文本文件(或者英文词频统计下载的英文长篇小说)进行词频统计. (1)开启所有的服务,并创建文件夹wwc (2)查看目录下所有文件 (3)把hdfs文件系统中文件夹里的文 ...

  7. python爬虫基础(一)~爬虫概念和架构

    目录 1. 爬虫 1.1 概念 1.2 分类 2. 爬虫架构 2.1 url管理器 2.2 网页(html)下载(download)器 2.2.1 urllib下载html源码 2.2.2 reque ...

  8. Python爬虫入门(2):爬虫基础了解

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  9. 【杂谈】爬虫基础与快速入门指南

    今天给大家分享一下网络爬虫的基础知识,以及一些优秀的开源爬虫项目.网络爬虫主要是我们在面对新的任务,但自己又没有数据的时候,获取自己想要的数据的一种手段.因此我们有必要掌握一定的爬虫知识,从而更好的准 ...

最新文章

  1. gj2 python中一切皆对象
  2. 程序包com.sun.istack.internal不存在
  3. RedisCacheManager设置Value序列化器技巧
  4. 关于深度学习框架Hamaa与Python API文档生成工具Sophon
  5. [一分钟先生]涂勇:通过跳槽走上管理岗位不可取
  6. 《第一本Docker书(修订版)》——第1章_简介_1.1Docker简介
  7. mp3文件怎么压缩大小
  8. Activiti工作流表结构详解
  9. linux ps 简书,Linux小白学习法宝-命令大全第一部分
  10. unity LineRender结合多点触摸 实现拖拽 重复画线
  11. 梦想在远方,理想在路上
  12. Pixelmator for Mac v3.9.9 功能强大的图像编辑软件
  13. 手动型三轴五档手动变速器设计(设计说明书+CAD图纸+外文翻译)
  14. php 文章页面阅读全文,给WordPress文章内容页增加阅读全文展开功能
  15. Apache 防止恶意解析
  16. error: #268: declaration may not appear after executable statement in block
  17. 入选31个细分领域丨通付盾荣登嘶吼安全产业研究院《2022网络安全产业图谱》
  18. 基于javaweb的医院病历信息管理系统(java+ssm+jsp+bootstrap+easyui+mysql)
  19. 红外循迹传感器PID循迹算法
  20. WiFi以及天线测试项目详解

热门文章

  1. 石墨烯之父”、诺贝尔物理学奖得主:造访江西理工大学
  2. Mate 50,来了!
  3. optimizer.step()代表什么意思
  4. 微信小程序开发之——用户登录-登录流程(1)
  5. HTML语义化标签理解
  6. 广义线性混合模型(GLMM)变量选择
  7. Viewpage使用
  8. 过滤器和拦截器(SpringMVC实现)
  9. 关于python的开发软件pycharm设置中文(无需汉化包)
  10. 阿里矢量图标(字体图标)使用