urllib库是python内置的网络请求库,不需要另行安装。
urlopen(url=url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *, cafile=None, capath=None, cadefault=False, context=None)
.参数说明:
url:请求响应的url.
data:请求的数据字典(注意:不带data参数的属于get请求,带data参数的属于post请求,主要用于设置自动登录网站)。
返回值:返回的是一个http.client.HTTPResponse对象————类文件句柄对象。
read()方法:读取整个见面;readline()读取一行;readlines()分行读取,返回列表。
getcode()方法:返回所请求的url页面编码:‘gbk’、'utf-8’等等。
发送最基本的请求,代码示例:
from urllib import request
url = 'http://www.baidu.com/'
# 发出请求
res = request.urlopen(url)
print(res.getcode()) # 查看返回状态码
print(res.geturl()) # 获取url
print(res.read().decode('utf-8')) # 打印获取的整个网页,解码后不会有乱码
urlretrieve(url, filename=None, reporthook=None, data=None)
代码示例:
from urllib import request
# 直接将百度首页源代码保存到本地文件'baidu.html'
request.urlretrieve('http://www.baidu.com/','baidu.html')
parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None,quote_via=quote_plus)
代码示例:
# 需要导入parse模块,返回经过编码的字符串
from urllib import parse
# 编码,默认‘utf-8’
enc = parse.urlencode({'name':'张三','age':18}) # 'name=%E5%BC%A0%E4%B8%89&age=18'
print(enc)
parse.parse_qsparse_qs(qs, keep_blank_values=False, strict_parsing=False,
encoding='utf-8', errors='replace', max_num_fields=None)
代码示例:
# 以默认编码进行解码,返回一个字典
qs = parse.parse_qs('wd=%E5%88%98%E5%BE%B7%E5%8D%8E') # ‘wd’:‘刘德华’
print(qs)
parse.urlparse(url, scheme='', allow_fragments=True)
parse.urlsplit(url, scheme='', allow_fragments=True)
代码示例:
from urllib import parse
"""两个函数基本上是一样的效果,二者唯一区别:urlparse()有params属性,而urlsplit()没有"""
url = 'http://www.baidu.com/s;hello?wd=pytthon&username=abc&pwd=123#1'
# 有params属性
r = parse.urlparse(url)
print('scheme:', r.scheme)
print('netloc:', r.netloc)
print('path:', r.path)
print('params:', r.params)
print('query=string:', r.query)
print('fragment:', r.fragment)
print("-"*30)
# 没有params属性
r = parse.urlsplit(url)
print('scheme:', r.scheme)
print('netloc:', r.netloc)
print('path:', r.path)
# print('params:',r.params)
print('query-string:', r.query)
print('fragment:', r.fragment)
在需要传递headers等参数时使用。
def __init__(self, url, data=None, headers={},origin_req_host=None, unverifiable=False,method=None)
代码示例:
"""调用Request类,设置请求头"""
from urllib import request
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
}
req = request.Request('http://httpbin.org/get',headers=headers)
resp = request.urlopen(req)
print('Status_Code:',resp.getcode())
通过ProxyHandler()(反爬虫的第二大招,通常也是最好用的)
handler = request.ProxyHandler({'http:','223.241.78.43:9999'})
代码示例:
# -*- coding: utf-8 -*-
"""设置代理IP"""
from urllib import request
# import random
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
}
# 设置代理
'''
如果代理IP足够多,可以设置一个代理池“list列表”,每次随机选择一个代理
proxy_list = [
{"http" : "124.88.67.81:80"},
{"http" : "124.88.67.81:80"},
{"http" : "124.88.67.81:80"},
{"http" : "124.88.67.81:80"},
{"http" : "124.88.67.81:80"}
]
proxy = randon.choice(proxy_list)
'''
proxy = {'https:','223.241.78.43:9999'} # 单一代理也容易被封
# 付费代理的写法
# proxy = request.ProxyHandler({"http":"账号:密码@143.226.164.130:16816"})
# 创建代理对象
handler = request.ProxyHandler(proxy)
# 创建opener对象
opener = request.build_opener(handler)
# 使用opener.open()发送请求
resp = opener.open('https://httpbin.org/ip', headers=headers)
print(resp.read())
什么是cookie?当我们使用自己的电脑通过浏览器进行访问网页的时候,服务器就会生成一个证书并返回给浏览器(客户端)并写入本地电脑,这个证书就是cookie(包含登录网站的用户名、密码、状态等信息)。一般来说cookie都是服务器端写入客户端的纯文本文件,一般不会超过4kb,过期的Cookie会自动删除。
访问网站时,服务器首先根据浏览器的编号生成一个cookie返回给客户端。客户端下次再访问时就会将自己本地的cookie加上url访问地址一同给服务器。服务器读出cookie内容,以此来辨别用户的状态。
相应参数说明:
name: Cookie变量名
value: Cookie变量值
expires: 该Cookie过期时间(FILETIME格式)的高位整数
path: cookie作用路径
domain: 该Cookie变量所属域,形如csdn.net/、blog.csdn.net/或blog.csdn.net/lixianlin/
secure: 是否在https协议下起作用
在爬虫编程中,cookie是加入到请求头中,一并向服务器发送请求,利用cookie模拟登录,示例如下:
form urllib import request
url = 'http://www.renren.com/880151247/profile' # 人人网 大鹏董成鹏 个人主页
# cookie需要放到请求头中
headers = {
'Cookie': 'anonymid=k81ctt22erz7qr; depovince=GW; _r01_=1; ick_login=1d2222ba-1313-4f3b-8954-82806d728bd3; taihe_bi_sdk_uid=b321fdb89e56adcc9e52edd47867dc37; taihe_bi_sdk_session=0683dd765bd4fa8f1272564fe8beb47a; t=23809fb84a8261158dd6fab2f12349891; societyguester=23809fb84a8261158dd6fab2f12349891; id=974056281; xnsid=3c22418; jebecookies=6b003d8c-d464-495d-8aba-cb88e3f93a63|||||; ver=7.0; loginfrom=null',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
# 使用urllib.request.Request类
req = request.Request(url, headers=headers)
opener = requests.build_opener(req)
resp = opener.open(req)
# 将网页源代码保存到本地硬盘
with open('renren.html','w',encoding='utf-8') as f:
f.write(resp.read().decode('utf-8')
该模块主要的类有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar四个类:
1、CookieJar:管理HTTP Cookie值、存储HTTP请求生成的cookie,向发出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
2、FileCookieJar(filename,delayload=None,policy=None):从CookieJar派生出来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储的文件名; delayload为True时支持延迟访问文件,只有在需要时才读取文件或在文件中存储数据。
3、MozillaCookieJar(filename,delayload=None,policy=None):从FileCookieJar中派生出来,创建与Mozilla(火狐浏览器)cookies.txt兼容的FileCookieJar实例。
4、LWPCookieJar:(filename,delayload=None,policy=None):从FileCookieJar中派生出来,创建与libwww.per
标准的Sert-Cookie3格式兼容的FileCookieJar实例,标准尚未完善,一般很少使用。
下面使用CookieJar、MozillaCookieJar类练习代码示例:
# -*- coding: utf-8 -*-
"""CookieJar对象,置于内存中,程序执行完毕即释放"""
from urllib import request
from http.cookiejar import CookieJar
'''
1. 登录
1.1 创建一个CookieJar对象
1.2 使用cookiejar创建一个HTTPCookieProcess对象
1.1.3 以1.2对象创建一个opener
1.1.4 使用opener发送用户名和密码
2. 访问大鹏个人主页
'''
headers = {
'Cookie': 'anonymid=k81ctt22erz7qr; depovince=GW; _r01_=1; ick_login=1d2222ba-1313-4f3b-8954-82806d728bd3; taihe_bi_sdk_uid=b321fdb89e56adcc9e52edd47867dc37; taihe_bi_sdk_session=0683dd765bd4fa8f1272564fe8beb47a; t=23809fb84a8261158dd6fab2f12349891; societyguester=23809fb84a8261158dd6fab2f12349891; id=974056281; xnsid=3c22418; jebecookies=6b003d8c-d464-495d-8aba-cb88e3f93a63|||||; ver=7.0; loginfrom=null',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
def get_opener():
"""创建CookieJar对象、opener"""
cookiejar = CookieJar()
handler = request.HTTPCookieProcessor(cookiejar)
opener = reques.build_opener(handler)
return opener
def login_renren(opener):
"""登录人人网"""
login_url = 'http://www.renren.com/Plogin.do'
data = {
'email':'[email protected]',
'password':'pythonspider'
}
req = request.Request(login_url, data=parse.urlencode(data).encode('utf-8'), headers=headers)
opener.open(req)
def visit_profile(opener):
"""访问大鹏个人主页,能访问则表示模拟登录成功"""
url = 'http://www.renren.com/880151247/profile'
req = request.Request(url, headers=headers)
resp = opener.open(req)
with open('renren.html', 'w', encoding='utf-8') as f:
f.write(resp.read().decode('utf-8'))
if __name__ == '__main__':
opener = get_opener()
def get_opener(opener)
visit_profile(opener)
将cookie保存到本地:
# -*- coding: utf-8 -*-
"""MozillaCookieJar对象,将cookies保存到本地文件,便于以后重用"""
from urllib import request
from http.cookiejar import MozillaCookieJar
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
login_url = 'https://httpbin.org/cookies/set?course=pythoner'
cookiejar = MoaillaCookieJar('cookie_baidu.txt') # cookie是一个纯文本文件
# cookiejar.load(ignore_discard=True, ignore_expires=True) # 加载本地cookie文件
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.buile_opener(handler)
req = request.Request(url, headers=headers)
resp = opener.open(req)
# 保存cookie信息,ignore_discard设置cookie是否过期,
# 由于上面创建CookieJar对象时指定了文件名参数,在此无需写出
cookiejar.save(ignore_discard=True, ignore_expires=True)
说明:本学习笔记根据晚上学习B站乐林贝斯发布的视频《Python爬虫】新手强烈推荐:Python爬虫教程,学爬虫这一套就够了》,白天学习CSDN博主【[数挖小飞飞]的《Python网络爬虫数据采集实战》博客记录,非常感谢!
菜鸟学习笔记,水平不够难免记错,如有不当之处,敬请指正,感激不尽!
Python3爬虫编程学习笔记(一)缘由
Python3爬虫编程学习笔记(二)爬虫原理