python网络爬虫--urllib库的使用(2)

一、模拟浏览器向服务器发送请求

统一资源定位符(url)组成:
在这里插入图片描述

import urllib.request
url = 'http://www.baidu.com'
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(url=url)
# 读取响应的内容
print(response.read(n))  返回二进制的值,n代表读取的字节数

二、response的类型和六个方法

类型:HTTPResponse

方法:
1.read()
2.readline() 读一行
3.readlines() 读取所有的数据,一行一行读取
4.geturl() 获取资源路径
5.getheaders() 获取服务器的响应头
6.getcode() 获取服务器响应的状态码

编码:字符串—>二进制,encode
解码:二进制---->字符串,decode

三、下载

3.1 下载网页

import urllib.request
url = 'https://www.baidu.com'
# filename 为下载完保存文件的名字
urllib.request.urlretrieve(url=url,filename='baidu.html')

3.2 下载图片

import urllib.request
url_image = '图片路径'
# filename 为下载完保存文件的名字
urllib.request.urlretrieve(url=url,filename='baidu.html')

403:Forbidden 禁止访问,图片防盗链

四、请求对象的定制

模拟浏览器向服务器发送请求,但有的网站会检测UA,如果请求中没有,则接收不到网站的数据。而urllib.request.urlopen()只能传入url,不能传入headers,所以要进行请求对象的定制。

import urllib.request

url = 'http://www.baidu.com'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60'
}
# 请求对象的定制
request = urllib.request.Request(url=url,headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

五、get 编码-(urllib.parse)

quote方法:单个参数编码

浏览器会自动编解码,但是pycharm不会,所有我们需要将汉语进行编码。但是编码时不能将一些特殊字符进行编码。

import urllib.parse
s = '田'
a = urllib.parse.quote(s)
print(a)   # %E7%94%B0

urlencode方法:多个参数进行编码

import  urllib.parse
data = {
    'wd':'韩红',
    'sex':'女'
}
data = urllib.parse.urlencode(data)
print(data)  # wd=%E9%9F%A9%E7%BA%A2&sex=%E5%A5%B3

六、post请求-百度翻译

import urllib.request
import urllib.parse

url = 'https://fanyi.baidu.com/sug'

data={
'kw':'car'
}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
# post请求必须进行编码并要进行encode方法的调用
data = urllib.parse.urlencode(data).encode('utf-8')
# post请求的参数 需要就行请求对象的定制,不需要进行拼接
request = urllib.request.Request(url=url,headers=headers,data=data)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)

import json
a = json.loads(content)
result = json.dumps(a,ensure_ascii=False)
print(result)

get、post区别:

get请求的参数必须编码,不需要调用encode方法,然后拼接到url后。
post请求的参数必须编码,需要调用encode方法,参数放在请求对象的定制中

七、ajax-get

ajax实质就是用ajax对象(xmlHttpRequest 简称xhr)异步的向服务器发送请求,服务器会返回部分数据,整个过程无刷新,不打断用户的操作。

八、ajax-post-肯德基官网

多页下载:

import urllib.request
import urllib.parse

def create_request():
    url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
    headers = {
        'User - Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 85.0.4183.102Safari / 537.36'
    }
    data = {
        'cname': '北京',
        'pid':' ',
        'pageIndex': (page-1)*10,
        'pageSize': 10
    }
    data = urllib.parse.urlencode(data).encode('utf-8')
    request = urllib.request.Request(url=url,headers=headers,data=data)
    return request


def get_content(request):
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    return content


def download(page,content):
    with open('kfc_'+str(page)+'.html','w',encoding='utf-8') as write_stream:
        write_stream.write(content)


if __name__ == '__main__':
    start_page = int(input('输入开始页码:'))
    end_page = int(input('输入结束页码:'))

    for page in range(start_page,end_page+1):
        # 请求对象的定制
        request = create_request()
        # 获取网页源码
        content = get_content(request)
        # 下载
        download(page,content)


九、异常:UrlError\HttpError

∙ \bullet HttpError是UrlError的子类
∙ \bullet 导入的包:urllib.error.URLError、 urllib.error.HttpError
∙ \bullet Http错误:它是针对浏览器无法连接到服务器而增加的错误提示,引导并告诉浏览者该网页是哪里出了问题。

十、cookie

10.1 cookie简介

在这里插入图片描述

10.2 cookie登录

import urllib.request

url = 'https://user.qzone.qq.com/396226001'
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'

}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
with open('qq.html', 'w') as wp:
    wp.write(content)

上述代码headers中没有加cookie所以下载的页面源码会跳转到登录界面,加上cookie后就会返回想要的页面。

十一、handler

请求对象的定制只能传入url、headers、data,而更高级的请求头需要传入代理、动态cookie。

十二、代理

12.1 代理服务器

定义:代理服务器是一种重要的服务区安全功能,它的工作主要在开放系统互联(osi)模型的会话层,从而起到防火墙的作用
功能:
∙ \bullet 突破自身IP的访问限制,访问外国站点
∙ \bullet 访问一些单位或者团体的内部资源
∙ \bullet 提高访问速度
∙ \bullet 隐藏真实IP

12.2 代码配置代理

步骤:
∙ \bullet 创建Request对象
∙ \bullet 创建ProxyHandler对象
∙ \bullet 用Handler对象创建opener对象
∙ \bullet 使用opener .open函数发送请求

import urllib.request

url = 'http://www.baidu.com/s?wd=ip'
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
'Cookie': 'BIDUPSID=D60E2D13DBF8F95B226D430F4E7C0826; PSTM=1600264646; BAIDUID=D60E2D13DBF8F95BCBFAB8AB6AA76458:FG=1; BD_UPN=12314753; BDRCVFR[Zln_T-KFICf]=pdg3iqubLhtTvqMULR8mvqV; delPer=0; BD_CK_SAM=1; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; __yjsv5_shitong=1.0_7_21c740d614b835cf5e85088fad59f209420b_300_1600417843027_106.38.62.154_78a35a11; yjs_js_security_passport=82163f1a233a65c9c66a394a2e523375c7a57783_1600417847_js; COOKIE_SESSION=0_0_0_0_3_0_0_0_0_0_0_0_310_0_918_0_1600433459_0_1600432541%7C1%230_0_1600432541%7C1; PSINO=1; BDSVRTM=14; H_PS_PSSID=32617_1442_32743_32328_32723_7631_32718'
}
request = urllib.request.Request(url=url, headers=headers)
# proxies 是一个代理的IP值
proxies = {
    'http': '202.112.51.45:3128'
}
handler = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)
content = response.read().decode('utf-8')
with open('daili.html', 'w', encoding='utf-8') as wp:
    wp.write(content)

12.3 代理池

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值