Python3爬虫编程学习笔记(三)学习urllib库基本用法

urllib库是python内置的网络请求库,不需要另行安装。

目 录

        • 1、request.urlopen()函数,url请求函数
        • 2、request.urlretrieve()函数,将指定网站源代码以文件形式保存到本地
        • 3、parse.urlencode()函数,把字典数据进行编码,不指定则默认使用‘utf-8’
        • 4、parse.parse_qs()函数,将进行过编码的数据解码,以识别(默认encoding='utf-8')
        • 5、pares.urlparse()、urlsplit()函数,根据url的参数分割url各个组成部分,返回一个字典
        • 6、request.Request类
        • 7、设置代理IP
        • 8、利用cookie自动登录网站
        • 9、使用http.cookieJar模块处理Cookie模拟登录网站
    •  

 

1、request.urlopen()函数,url请求函数

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'))  # 打印获取的整个网页,解码后不会有乱码

 

2、request.urlretrieve()函数,将指定网站源代码以文件形式保存到本地

  urlretrieve(url, filename=None, reporthook=None, data=None)

代码示例:

from urllib import request

# 直接将百度首页源代码保存到本地文件'baidu.html'
request.urlretrieve('http://www.baidu.com/','baidu.html')

 

3、parse.urlencode()函数,把字典数据进行编码,不指定则默认使用‘utf-8’

 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)

 

4、parse.parse_qs()函数,将进行过编码的数据解码,以识别(默认encoding=‘utf-8’)

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)

 

5、pares.urlparse()、urlsplit()函数,根据url的参数分割url各个组成部分,返回一个字典

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)

 

6、request.Request类

在需要传递headers等参数时使用。

def __init__(self, url, data=None, headers={},origin_req_host=None, unverifiable=False,method=None)
  • 老师说最基本的反爬手段:是在请求时需要增加请求头headers

代码示例:

"""调用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())

 

7、设置代理IP

通过ProxyHandler()(反爬虫的第二大招,通常也是最好用的)

handler = request.ProxyHandler({'http:','223.241.78.43:9999'})
  • 大多数的网站会在某一段时间,去检测某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP的访问。所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。

代码示例:

# -*- 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())

 

8、利用cookie自动登录网站

什么是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')

 

9、使用http.cookieJar模块处理Cookie模拟登录网站

该模块主要的类有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爬虫编程学习笔记(二)爬虫原理

你可能感兴趣的:(爬虫编程)