【零基础学Python】爬虫篇 :第十二节--三种请求|post请求|cookie登录|handler处理器

本文介绍了Python爬虫的进阶技巧,包括使用Post请求爬取肯德基门店数据,分析并处理URLError和HTTPError异常,利用Cookie解决QQ空间登录问题,以及理解Handler处理器和代理的基本使用。通过实例代码详细讲解了如何在爬虫中应用这些技术。
摘要由CSDN通过智能技术生成

在这里插入图片描述

📢📢📢📣📣📣
🌻🌻🌻Hello,大家好我叫是Dream呀,一个有趣的Python博主,小白一枚,多多关照😜😜😜
🏅🏅🏅CSDN Python领域新星创作者,大二在读,欢迎大家找我合作学习
💕 入门须知:这片乐园从不缺乏天才,努力才是你的最终入场券!🚀🚀🚀
💓最后,愿我们都能在看不到的地方闪闪发光,一起加油进步🍺🍺🍺
🍉🍉🍉“一万次悲伤,依然会有Dream,我一直在最温暖的地方等你”,唱的就是我!哈哈哈~🌈🌈🌈
🌟🌟🌟✨✨✨

让我们进一步了解一下爬虫,为urllib做最后的收尾吧~

一、post请求肯德基官网

肯德基官网 中找到餐厅查询,找出指定位置所有的门店。在这里插入图片描述

1.分析页面

在这里插入图片描述
第一页:

请求网址: http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname、
请求方法: POST
Data:
cname: 北京
pid:
pageIndex: 1
pageSize: 10

第二页:

> 请求网址: http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname、
> 请求方法: POST
> `Data:`
> cname: 北京
pid: 
pageIndex: 2
pageSize: 10

可以发现,页面之间只是data不同,所以说我们只需要更改data就可以了。

2.代码编写

1.代码入口

if __name__=='__main__':
    start_page = int(input(''))
    end_page = int(input(''))
    for page in range(start_page,end_page+1):
        # 请求对象的定制
        request=creat_request(page)
        # 获取页面源码
        content=get_content(request)
        # 下载
        down_load(page,content)

2.请求对象定制

post请求不要忘记data数据的解码:encode('utf-8')

def creat_request(page):
    base_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
    data={
        'cname': '北京',
        'pid':'',
        'pageIndex':page,
        'pageSize': '10'
    }
    data = urllib.parse.urlencode(data).encode('utf-8')

    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'
    }
    request=urllib.request.Request(url=base_url,headers=headers,data=data)
    return request

return 一定不要忘了写,每个函数你要给他返回一个数据。

3.获取页面源码

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

4.下载页面内容

def down_load(page,content):
    with open('kfc_'+str(page)+'.json','w',encoding='utf-8') as fp:
        fp.write(content)

5.源码

# -*-coding:utf-8 -*-
# @Author:到点了,心疼徐哥哥
# 奥利给干!!!
# post请求
# 第一页:
# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# cname: 北京
# pid:
# pageIndex: 1
# pageSize: 10

# 第二页
# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# cname: 北京
# pid:
# pageIndex: 2
# pageSize: 10

import urllib.request
import urllib.parse
# base_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
def creat_request(page):
    base_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
    data={
        'cname': '北京',
        'pid':'',
        'pageIndex':page,
        'pageSize': '10'
    }
    data = urllib.parse.urlencode(data).encode('utf-8')

    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'
    }
    request=urllib.request.Request(url=base_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 down_load(page,content):

    with open('kfc_'+str(page)+'.json','w',encoding='utf-8') as fp:
        fp.write(content)

if __name__=='__main__':
    start_page = int(input(''))
    end_page = int(input(''))
    for page in range(start_page,end_page+1):
        # 请求对象的定制
        request=creat_request(page)
        # 获取页面源码
        content=get_content(request)
        # 下载
        down_load(page,content)

6.爬取结果

爬取1-10页:
在这里插入图片描述

二 、URLError\HTTPError异常分析

HTTPError类是URLError类的子类

# -*-coding:utf-8 -*-
# @Author:到点了,心疼徐哥哥
# 奥利给干!!!
import urllib.request
import urllib.error
url = 'https://blog.csdn.net/m0_37816922/article/details/120'

# url = 'http://xuxuxu.com'

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'
    }
try:
    request = urllib.request.Request(url=url,headers=headers)
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    # print(content)
# except urllib.error.HTTPError:
#     print('系统正在升级。。。')

except urllib.error.URLError:
    print('我都说了,系统正在升级。。。')

通过urllib发送请求的时候,有可能会发送失败,这个时候如果想让你的代码更加的健壮,可以通过try‐ except进行捕获异常,异常有两类,URLError\HTTPError

三、cookie解决QQ空间登录

1.正常爬取

分析页面:在这里插入图片描述
找到接头,读取其中的headers,获取页面内容:

# -*-coding:utf-8 -*-
# @Author:到点了,心疼徐哥哥
# 奥利给干!!!
import urllib.request

url = 'https://user.qzone.qq.com/2511864242/infocenter'
headers={
    # ':authority':' user.qzone.qq.com',
    # ':method':' GET',
    # ':path':' /2511864242/infocenter',
    # ':scheme':' https',
    # 'accept':' text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    # 'accept-encoding':' gzip, deflate, br',
    # 'accept-language':' zh-CN,zh;q=0.9',
    # 'cache-control':' max-age=0',
    # 'cookie':' 2511864242_totalcount=13496; 2511864242_todaycount=2; RK=ECihmXLCuq; ptcz=641b0fe4634b74d761ce9c469c93f3766a6ad2639d4490f37aeb876008c0eba7; tvfe_boss_uuid=1261d53129453d07; o_cookie=2511864242; eas_sid=X0nkgoLJGuyN43gKCxXdODxpVi; QZ_FE_WEBP_SUPPORT=1; cpu_performance_v8=0; nutty_uuid=b2d3e37a-bdbd-488e-9f21-3b53e541dfee; __Q_w_s_hat_seed=1; _ga=GA1.2.118587915.1626953898; fqm_pvqid=39ed0947-c27f-433b-b69a-f45b9890024c; luin=o2511864242; lskey=00010000de072c8e6e48fa1574db17cc9090c4a164266c5036e26a0c559f714d2b597dfb256d9a9440358b1d; pgv_pvid=6039633865; ptui_loginuin=tustaixueshenghui@163.com; _gid=GA1.2.1366085169.1633784022; uin=o2511864242; _qpsvr_localtk=0.7957179321058889; skey=@Ysdnvfow4; p_uin=o2511864242; pt4_token=IPJ09cE1ONrApR1DDtSPKXtObrnyYWHykLFRh5JRyKc_; p_skey=aKyCTikz4zFyYTIAZ4OAdlzt77pg0t8h3EImRUrZGDI_; Loading=Yes; pgv_info=ssid=s4493287755; qz_screen=1536x864; qzmusicplayer=qzone_player_2511864242_1633869885141; qqmusic_uin=; qqmusic_key=; qqmusic_fromtag=',
    # 'if-modified-since: Sun, 10 Oct 2021 12:44':'32 GMT',
    # 'sec-ch-ua':' "Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"',
    # 'sec-ch-ua-mobile':' ?0',
    # 'sec-ch-ua-platform':' "Windows"',
    # 'sec-fetch-dest':' document',
    # 'sec-fetch-mode':' navigate',
    # 'sec-fetch-site':' none',
    # 'sec-fetch-user':' ?1',
    # 'upgrade-insecure-requests':' 1',
    'user-agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36',
}
# 请求对象的定制
request = urllib.request.Request(url=url,headers = headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
# 获取相应的数据
# content = response.read().decode('utf-8')
content = response.read().decode('utf-8')
# 将数据保存到本地
with open('qq1.html','w',encoding='utf-8') as fp:
    fp.write(content)

得到结果:
在这里插入图片描述
进入之后会发现,只是进入了登录界面,并没有登陆进去:
在这里插入图片描述

2.利用cookie解决问题:

将请求标头中的全部数据都写到headers中:
在这里插入图片描述

':authority':' user.qzone.qq.com',
':method':' GET',
':path':' /2511864242/infocenter',
':scheme':' https',
'accept':' text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'accept-encoding':' gzip, deflate, br',
'accept-language':' zh-CN,zh;q=0.9',
'cache-control':' max-age=0',
'cookie':' 2511864242_totalcount=13496; 2511864242_todaycount=2; RK=ECihmXLCuq; ptcz=641b0fe4634b74d761ce9c469c93f3766a6ad2639d4490f37aeb876008c0eba7; tvfe_boss_uuid=1261d53129453d07; o_cookie=2511864242; eas_sid=X0nkgoLJGuyN43gKCxXdODxpVi; QZ_FE_WEBP_SUPPORT=1; cpu_performance_v8=0; nutty_uuid=b2d3e37a-bdbd-488e-9f21-3b53e541dfee; __Q_w_s_hat_seed=1; _ga=GA1.2.118587915.1626953898; fqm_pvqid=39ed0947-c27f-433b-b69a-f45b9890024c; luin=o2511864242; lskey=00010000de072c8e6e48fa1574db17cc9090c4a164266c5036e26a0c559f714d2b597dfb256d9a9440358b1d; pgv_pvid=6039633865; ptui_loginuin=tustaixueshenghui@163.com; _gid=GA1.2.1366085169.1633784022; uin=o2511864242; _qpsvr_localtk=0.7957179321058889; skey=@Ysdnvfow4; p_uin=o2511864242; pt4_token=IPJ09cE1ONrApR1DDtSPKXtObrnyYWHykLFRh5JRyKc_; p_skey=aKyCTikz4zFyYTIAZ4OAdlzt77pg0t8h3EImRUrZGDI_; Loading=Yes; pgv_info=ssid=s4493287755; qz_screen=1536x864; qzmusicplayer=qzone_player_2511864242_1633869885141; qqmusic_uin=; qqmusic_key=; qqmusic_fromtag=',
'if-modified-since: Sun, 10 Oct 2021 12:44':'32 GMT',
'sec-ch-ua':' "Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"',
'sec-ch-ua-mobile':' ?0',
'sec-ch-ua-platform':' "Windows"',
'sec-fetch-dest':' document',
'sec-fetch-mode':' navigate',
'sec-fetch-site':' none',
'sec-fetch-user':' ?1',
'upgrade-insecure-requests':' 1',
'user-agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36',

在这些数据中,:开头的数据肯定都是没用的,去掉就行了,其实也就是只有cookie有用,所以说我们将cookie数据保留:
cookie中携带着你的登录信息 如果有登录之后的cookie,南无我们就可以携带者cookie进入任何界面。

# -*-coding:utf-8 -*-
# @Author:到点了,心疼徐哥哥
# 奥利给干!!!
import urllib.request

url = 'https://user.qzone.qq.com/2511864242/infocenter'
headers={
    # ':authority':' user.qzone.qq.com',
    # ':method':' GET',
    # ':path':' /2511864242/infocenter',
    # ':scheme':' https',
    # 'accept':' text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    # 'accept-encoding':' gzip, deflate, br',
    # 'accept-language':' zh-CN,zh;q=0.9',
    # 'cache-control':' max-age=0',
    # 'cookie':' 2511864242_totalcount=13496; 2511864242_todaycount=2; RK=ECihmXLCuq; ptcz=641b0fe4634b74d761ce9c469c93f3766a6ad2639d4490f37aeb876008c0eba7; tvfe_boss_uuid=1261d53129453d07; o_cookie=2511864242; eas_sid=X0nkgoLJGuyN43gKCxXdODxpVi; QZ_FE_WEBP_SUPPORT=1; cpu_performance_v8=0; nutty_uuid=b2d3e37a-bdbd-488e-9f21-3b53e541dfee; __Q_w_s_hat_seed=1; _ga=GA1.2.118587915.1626953898; fqm_pvqid=39ed0947-c27f-433b-b69a-f45b9890024c; luin=o2511864242; lskey=00010000de072c8e6e48fa1574db17cc9090c4a164266c5036e26a0c559f714d2b597dfb256d9a9440358b1d; pgv_pvid=6039633865; ptui_loginuin=tustaixueshenghui@163.com; _gid=GA1.2.1366085169.1633784022; uin=o2511864242; _qpsvr_localtk=0.7957179321058889; skey=@Ysdnvfow4; p_uin=o2511864242; pt4_token=IPJ09cE1ONrApR1DDtSPKXtObrnyYWHykLFRh5JRyKc_; p_skey=aKyCTikz4zFyYTIAZ4OAdlzt77pg0t8h3EImRUrZGDI_; Loading=Yes; pgv_info=ssid=s4493287755; qz_screen=1536x864; qzmusicplayer=qzone_player_2511864242_1633869885141; qqmusic_uin=; qqmusic_key=; qqmusic_fromtag=',
    # 'if-modified-since: Sun, 10 Oct 2021 12:44':'32 GMT',
    # 'sec-ch-ua':' "Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"',
    # 'sec-ch-ua-mobile':' ?0',
    # 'sec-ch-ua-platform':' "Windows"',
    # 'sec-fetch-dest':' document',
    # 'sec-fetch-mode':' navigate',
    # 'sec-fetch-site':' none',
    # 'sec-fetch-user':' ?1',
    # 'upgrade-insecure-requests':' 1',
    'user-agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36',
}
# 请求对象的定制
request = urllib.request.Request(url=url,headers = headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
# 获取相应的数据
# content = response.read().decode('utf-8')
content = response.read().decode('utf-8')
# 将数据保存到本地
with open('qq1.html','w',encoding='utf-8') as fp:
    fp.write(content)

查看结果:
果然进去了QQ空间:
在这里插入图片描述

四、Handler处理器

为什么要学习handler?
urllib.request.urlopen(url) :不能定制请求头 urllib.request.Request(url,headers,data) :可以定制请求头
Handler :定制更高级的请求头(随着业务逻辑的复杂 请求对象的定制已经满足不了我们的需求(动态cookie和代理 不能使用请求对象的定制)

# -*-coding:utf-8 -*-
# @Author:到点了,心疼徐哥哥
# 奥利给干!!!
import urllib.request

url = 'https://www.baidu.com'
# 请求对象的定制为了解决反爬的第一种手段
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'
}
request = urllib.request.Request(url=url,headers=headers)

# handler build_opener open

# (1)获取handler对象
handler = urllib.request.HTTPHandler()

# (2)获取opener对象
opener = urllib.request.build_opener(handler)

# 调用open方法
response = opener.open(request)
content = response.read().decode('utf-8')
print(content)

五、代理基本使用

访问自己ip:ip
在这里插入图片描述
1.代理的常用功能?

  1. 突破自身IP访问限制,访问国外站点。
  2. 访问一些单位或团体内部资源 扩展:某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务 器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。
  3. 提高访问速度 扩展:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲 区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。
  4. 隐藏真实IP 扩展:上网者也可以通过这种方法隐藏自己的IP,免受攻击。

2.代码配置代理

  • 创建Reuqest对象
  • 创建ProxyHandler对象
  • 用handler对象创建opener对象
  • 使用opener.open函数发送请求

1.正常访问此页面:

# -*-coding:utf-8 -*-
# @Author:到点了,心疼徐哥哥
# 奥利给干!!!
import urllib.request
url='https://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/94.0.4606.81 Safari/537.36'
}
# 请求对象定制
request = urllib.request.Request(url=url,headers=headers)

# 模拟浏览器访问服务器
response = urllib.request.urlopen(request)

# 获取响应信息
content = response.read().decode('utf-8')

# 保存
with open('daili.html','w',encoding='utf-8') as fp:
    fp.write(content)

2.使用handler方法

使用代理ip进行访问:快代理免费IP
使用代理ip隐藏自己的真是ip。

# -*-coding:utf-8 -*-
# @Author:到点了,心疼徐哥哥
# 奥利给干!!!
import urllib.request

url='https://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/94.0.4606.81 Safari/537.36'
}
# 请求对象定制
request = urllib.request.Request(url=url,headers=headers)

proxies={
    'http':'118.24.219.151:16817'

}

handler = urllib.request.ProxyHandler(proxies=proxies)

opener = urllib.request.build_opener(handler)

# 模拟浏览器访问服务器
# response = urllib.request.urlopen(request)
response = opener.open(request)

# 获取响应信息
content = response.read().decode('utf-8')

# 保存
with open('yincangdaili1.html','w',encoding='utf-8') as fp:
    fp.write(content)

📢📢📢最后的福利

☀️☀️☀️最后一点小福利带给大家:如果想快速上手python的小伙伴们,这个详细整理PPT可以迅速帮助大家打牢python基础,需要的小伙伴们可以下载一下 Python入门基础教程全套+小白速成+学不会来找我! 🍻🍻🍻
还有自制表白神器,需要自取:
Python表白神器,源码+解析+各种完美配置+浪漫新颖 🍻🍻🍻
在这里插入图片描述
🌲🌲🌲 好啦,这就是今天要分享给大家的全部内容了
❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~
在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是Dream呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值