爬虫基本库的使用

(笔记)网络请求:urllib库/requests库的基本使用

·urllib库 python内置库,是一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。
·requests库 第三方库

在python3中所有和网络请求相关的方法,都被集中在urllib.requests模块下面了。

·Urlopen函数 以下先来看urlopen函数的基本使用:

from urllib import request
resp = request.urlopen('https://www.sogou.com/')#网址中一定不能出现汉字,需要编码。

```python
print(resp.read().decode('utf-8'))

urlopen函数详解
创建一个表示远程的url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。
函数的定义:

def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):
    '''Open the URL url, which can be either a string or a Request object.

    *data* must be an object specifying additional data to be sent to
    the server, or None if no such data is needed.  See Request for
    details.
  1. url:请求一个url
  2. Data:请求的data,如果设置了这个值,那么将变成post请求。
  3. 返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline、readlines、getcode等方法。
    #getcode用于返回获取的状态码
    如将上面的代码改为
print(resp.getcode())
返回值为200,状态码表示返回成功。

·Urlretrieve函数
这个函数可以方便地将网页上的一个文件保存到本地。
函数的定义:

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

以下代码可以非常方便的将搜狗的首页下载到本地:

from urllib import request
request.urlretrieve('https://www.sougou.com','sougou.html')

类似的也可以下载网页上的图片,request.urlretrieve(‘url’,‘名称.jpg’)

·urlencode函数
urlencode函数可以把字典数据转换为url编码的数据。
示例代码如下:

from urllib import parse
data = {'name':'爬虫','greet':'hello world','age':18}
qs = parse.urlencode(data)
print(qs)
输出结果为 name=%E7%88%AC%E8%99%AB&greet=hello+world&age=18

将中文部分进行编码
#补充
如果想对字符串编码而不是字典编码,则:

from urllib import parse
#对字典进行编码:
data = {'wd':'石原里美'}
qs = parse.urlencode(data)
print(qs)
#对字符串进行编码
a = '石原里美'
b = parse.quote(a)
print(b)
 输出的结果分别为
 wd=%E7%9F%B3%E5%8E%9F%E9%87%8C%E7%BE%8E
 %E7%9F%B3%E5%8E%9F%E9%87%8C%E7%BE%8E

parse_qs函数
可以将经过编码后的url参数进行解码。
示例代码:(接上)

print(parse.parse_qs(qs))
输出:{'wd': ['石原里美']}

url解析:urlparse函数和urlsplit函数
有时候拿到一个url,想要对这个url中的各个组成部分进行分割,那么这个时候就可以使用urlparse或者是urlsplit来进行分割。
urlparse和urlsplit基本上是一模一样的。
唯一不一样的地方是:
urlparse里有params属性,而 urlsplit没有这个属性。

from urllib import parse
url = 'https://www.sogou.com/web?query=Amy'
result = parse.urlparse(url)
print(result)
输出结果:
ParseResult(scheme='https', netloc='www.sogou.com', path='/web',  params='', query='query=Amy', fragment='')

#注:输出结果中含有params,如果将urlparse函数改为urlsplit,则没有这项。(二者唯一的区别)
也可以部分打印

print(result.scheme)
print(result.netloc)
print(result.path)

request.Request类
与urlopen功能类似,用于网络请求,但略高级一些。如果想要在请求的时候增加一些请求头,那么就必须使用request.Request类来实现。

from urllib import request
headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4173.2 Safari/537.36'}
rq = request.Request('https://www.baidu.com/',headers = headers)
resp = request.urlopen(rq)
print(resp.read().decode('utf-8'))

之前在访问百度页面时不能正常访问,通过伪造U-A实行网页的正常访问。

·ProxyHandler处理器(代理设置) —解决封IP问题
很多网站会检测一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问量次数多得不像是个正常人,它会禁止这个IP访问。
http://httpbin.org:查看http请求的一些参数。

#未使用代理地址
from urllib import request
url = 'http://httpbin.org/ip'
resp = request.urlopen(url)
print(resp.read())

返回的为当前使用的ip地址,此处尚未使用代理地址。
使用代理的格式如下:

#使用代理
from urllib import request
url = 'http://httpbin.org/ip'
#1.使用ProxyHandler,传入代理构建一个handler
handler = request.ProxyHandler({'http':'60.13.42.232:9999'}) #9999是端口号
#2.使用上面创建的handler构建一个opener
opener = request.build_opener(handler)
#3.使用opener去发送一个请求
resp = opener.open(url)
print(resp.read())

·什么是cookie
指某些网站为了辨别用户身份、进行的session跟踪而存储在用户本机地址终端上的数据。
cookie存储的数据数量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie时只能存储一些小量的数据。

·cookie的格式
set-cookie:NAME=VALUE;Expire/Max-age=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE参数意义:
NAME:cookie的名字
VALUE:cookie的值
Expires:cookie的过期时间
Path:cookie作用的路径
Domain:cookie作用的域名
SECURE:是否只在https协议下使用
示例 (实现代码的模拟登录知乎):

from urllib import request
url = 'https://www.zhihu.com/hot'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4173.2 Safari/537.36','cookie':'网页的cookie信息'}
resp = request.urlopen(url)
print(resp.read().decode('utf-8'))

·http.cookiejar模块

from urllib import request
from urllib import parse
from http.cookiejar import CookieJar

#登录
#1.1创建cookiejar对象(用来存储cookie数据)
cookiejar = CookieJar()
#1.2使用cookiejar创建一个HTTPCookieProcess对象
handler = request.HTTPCookieProcessor(cookiejar)
#1.3使用上一步创建的handler创建一个opener
opener = request.build_opener(handler)
#1.4使用opener方式登录请求(账号和密码)
post_url = '登录网址'
post_data = parse.urlencode({'usename':'....','password':'....'})
req = request.Request(post_url,data=post_data.encode('utf-8'))
opener.open(req)

#2.访问个人网页
url = '个人网页网址'
rq = request.Request(url,headers=headers)
resp = opener.open(rq)
print(resp.read().decode('utf-8'))
#cookie信息的保存
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar('cookie.txt')
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('https://www.baidu.com/')

cookiejar.save()

·requests库—第三方库,需要pip install requests安装

发送get请求:

import requests

#添加headers和查询参数
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4173.2 Safari/537.36'}
kw = {'wd':'爬虫'}
#params接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
response = requests.get('http://www.baidu.com/',headers = headers,params=kw)
print(response)
输出结果为<Response [200]>

查询响应内容

#查询响应内容
print(response.text)    #返回unicode格式的数据(解码后的字符串)
print(response.content.decode('utf-8'))  #返回字节流数据(手动解码)

response.text和response.content的区别:
1.response.content:这个是直接从网络上抓取的数据,没有经过任何编码,所以是bytes类型,其实在硬盘上和网络上传输的字符串都是bytes类型。
2.response.text:这个是str的数据类型,是request库将response.content进行解码的字符串,解码需要指定一个解码方式,requests会根据自己的猜测来判断编码的方式,所以有时候可能会猜测错误,就会导致解码产生乱码,这时候进行手动解码,比如使用response.content.decode(‘utf-8’)。
发送post请求
最基本的post请求方法

import = requests
response = request.post('http://www.baidu.com/',data=data)
print(resp.text)

使用代理
只要在请求方法中(比如get或者post)传递proxies参数就可以了。
示例如下:

#使用代理
import requests
proxy = {'http':'ip地址:端口号'}
url = 'http://httpbin.org/ip'
resp = requests.get(url,proxies=proxy)
print(resp.text)

requests库操作cookies

import requests
response = requests.get('http://www.baidu.com/')
print(response.cookies)
print(response.cookies.get_dict())
import requests
url = 'https://www.zhihu.com/hot'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4173.2 Safari/537.36',
           'cookies':'_zap=5846634c-1abd-4561-b063-b1b145deef5a; d_c0="ADCdVZQnshGPTrjgS3hcTYvqK8lsnEL00ok=|1596793529"; _ga=GA1.2.255749710.1596793531; capsion_ticket="2|1:0|10:1596793533|14:capsion_ticket|44:OWRhZDM0ZjEwNTYxNGE5MGIzYTkyNWJhNDJmMjI2ZTg=|cfa09a5aad6647442a81b3c2d16adcee165f5328d54913e313302524e51c9408"; z_c0="2|1:0|10:1596793561|4:z_c0|92:Mi4xWVlOT0RRQUFBQUFBTUoxVmxDZXlFU1lBQUFCZ0FsVk4yWEFhWUFDSC16eDlab1pjcTVfQTI4OFpsOWs3cFBScDlR|14f8a4f6b4dbc7d15d06a1bed65537f9b47e6dfa12f76c927c19f25ca93425b9"; _xsrf=549a6b9d-fca4-4ddf-8967-d11a1c4e558d; _gid=GA1.2.746338181.1597236117; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1596793530,1597236117; SESSIONID=zTDE0eTU4rSGBx6wERBLsexcuwFoSbBkv6oGn1xX1Jo; JOID=VVgcB0jszQtiZ4I_fe--Xu77po5ikZBCIFPgYiXcuFEoIv4OA3QqMj5kjDt33ln3t6hsZI_hiaWToUl7zHRT0rU=; osd=W1EVBkLixAJjbYw2dO60UOfyp4RsmJlDKl3payTWtlghI_QACn0rODBthTp90FD-tqJibYbgg6uaqEhxwn1a078=; tst=h; tshl=; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1597236511; KLBRSID=3d7feb8a094c905a519e532f6843365f|1597236912|1597236114'}
resp = requests.get(url,headers=headers)
print(resp.text)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigBig_Dream

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值