首页 > 编程语言 >Python爬虫(5-10)-编解码、ajax的get请求、ajax的post请求、URLError/HTTPError、微博的cookie登录、Handler处理器

Python爬虫(5-10)-编解码、ajax的get请求、ajax的post请求、URLError/HTTPError、微博的cookie登录、Handler处理器

时间:2024-07-17 22:52:35浏览次数:20  
标签:10 请求 url request urllib content ajax data page

五、编解码(Unicode编码)

(1)GET请求

所提方法都在urllib.parse.路径下

  • get请求的quote()方法(适用于只提交一两个参数值)
url='http://www.baidu.com/baidu?ie=utf-8&wd='

# 对汉字进行unicode编码
name=urllib.parse.quote('白敬亭')
url+=name
  • get请求的urlencode()方法(适用于提交多个参数)
base_url='http://www.baidu.com/baidu?'

data={
    'wd':'白敬亭',
    'sex':'男',
    'address':'中国'
}

new_data=urllib.parse.urlencode(data)
url=base_url+new_data

(2)POST请求

百度翻译

1.以百度翻译为例,输入需翻译的单词后,点击”检查”—”网络”,发现存在多个名为sug的文件

2.找到最后一个名为sug的文件,观察其请求和响应,发现就是我们要找的接口URL

3.代码如下

# post请求百度翻译
url='https://fanyi.baidu.com/sug'

headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0'
}

data={
    'kw':'spider'
}
# post请求的参数必须进行编码,转为字节型
# post的请求的参数是不会拼接在URL的后面的,而是需要放在清求对象定制的参数中
data=urllib.parse.urlencode(data).encode('utf-8')
request=urllib.request.Request(url=url,data=data,headers=headers)
response=urllib.request.urlopen(request)

content=response.read().decode('utf-8')

import json
# 将json字符串变为python对象
obj=json.loads(content)
print(obj)

4.总结

  • post请求方式的参数必须进行编码
  • 编码之后必须调用encode()方法
  • 参数要放在请求对象定制的方法中

六、ajax的get请求

(1)获取豆瓣电影的第一页的数据

1.打开“豆瓣电影”—“排行榜”—“喜剧”,找到接口(也就是找到某一个东西,该东西能展现当前页面的数据),由“响应”可以判断出所需的url

2.保存豆瓣电影的第一页的数据的代码如下:


import urllib.request

# ajax的get请求
# 获取豆瓣电影的第一页的数据并且保存起来
url='https://movie.douban.com/j/chart/top_list?type=24&interval_id=100:90&action=&start=0&limit=20'

headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0'
}

request=urllib.request.Request(url=url,headers=headers)
response=urllib.request.urlopen(request)
content=response.read().decode('utf-8')
# print(content)

# open方法默认情况下使用的是gbk的编码
# 使用UTF-8编码方式打开/创建名为douban.json文件
# 法一
fp=open('douban.json','w',encoding='utf-8')
fp.write(content)
# 法二
with open('douban1.json','w') as fp:
    fp.write(content)

在法二中,with 语句用于管理文件对象的打开和关闭。as 关键字用于给文件对象取一个别名,这里是fpfp.write(): 这是文件对象的一个方法,用于向文件中写入内容。

(2)获取豆瓣电影前十页的数据

1.观察可发现,URLstart的规律,start=(page-1)*20

2.代码展示如下

# 获取豆瓣电影的前十页数据并且保存起来

def create_request(page):
    headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0'
}
    url='https://movie.douban.com/j/chart/top_list?'
    data={
  "type": 24,
  "interval_id": "100:90",
  "action": "",
#   观察可得start的规律
  "start": (page-1)*20,
  "limit": 20
    }
    new_data=urllib.parse.urlencode(data)
    url+=new_data
    request=urllib.request.Request(url=url,headers=headers)
    return request

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

def load_content(page,content):
    # 要将整形变量page转变为字符串
    # 如果直接加单引号,page被当作一个字面量字符串,而不是变量page
    with open('douban_'+str(page)+'.json','w') as fp:
        fp.write(content)

# 程序的入口
if __name__=='__main__':
    start_page=int(input('请输入开始的页码'))
    end_page=int(input('请输入结束的页码'))
    for page in range(start_page,end_page):
        request=create_request(page)
        content=get_content(request)
        load_content(page,content)
    

七、ajax的post请求

1.观察发现”kfc官网“-”餐厅查询“网页的接口

2.代码如下

# ajax的post请求--肯德基官网

def create_request(page):
    url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
    data={
	'cname':'濮阳',
	'pid':'',
	'pageIndex':page,
	'pageSize':10
	}
    new_data=urllib.parse.urlencode(data).encode('utf-8')
    headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0'
}
    # post方式不能直接拼接,要在请求对象定制的方法中加入该参数
    request=urllib.request.Request(url=url,headers=headers,data=new_data)
    return request

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

def load_content(page,content):
    with open('kendeji'+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):
        request=create_request(page)
        content=get_content(request)
        print(f"页面 {page} 的内容: {content}")
        # load_content(page,content)
        

八、URLError/HTTPError

简介:1.HTTPError类是URLError类的子类
2.导入的包urllib.error.HTTPErrorurllib.error.URLError
3.http错误:http错误是针对浏览器无法连接到服务器而增加出来的错误提示。引导并告诉浏览者该页是哪里出了问题。
4.通过urllib发送请求的时候,有可能会发送失败,这个时候如果想让你的代码更加的健壮,可以通过try-except进行捕获异常,异常有两类:URLError/HTTPError

捕获异常的代码可参考下图:

九、微博的cookie登录

登录https://weibo.cn/5915756025/info

注意:URL中的那串数字根据自己的进行转换。当我们成功登录微博后,观察登陆成功的URL,得到上面所需要的那串数字

代码如下:

# 利用cookie获取微博登录页面
url='https://weibo.cn/5915756025/info'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0',
# 如果不带cookie,只能获得一直加载中的登录页面
'Cookie':'SCF=AuRE_quArNVh-RyQwgY_Mfyf1dQ9GXz5mpS5n6rPb4yrZ7pKGOaRqZ_TEjQo1ZKv0CUTDGSjai3FDr5cew5mnSM.; SUB=_2A25Lk7bsDeRhGeNH6lcW9SjMyTmIHXVo0LYkrDV6PUJbktAGLRj4kW1NSsw-pVvkP4MUFdoRPrVOGCv000hCGyH4; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W5a32BT_aSyAG8TS1.P-hxi5NHD95Qf1K2fS0-cehzfWs4Dqcjai--Ri-8si-zNi--fi-2Xi-24i--fi-2Xi-24i--fi-ihiKn7i--fi-isiKn0PN.t; SSOLoginState=1721222844; ALF=1723814844; _T_WM=7dcb8e0c308d256e687e3e446561c97c'
}

request=urllib.request.Request(url=url,headers=headers)
response=urllib.request.urlopen(request)
content=response.read().decode('utf-8')
# print(content)
with open('weibo.html','w') as fp:
    fp.write(content)

cookie中携带着你的登陆信息,如果有登陆之后的cookie,那么我们就可以携带着cookie进入到任何页面

学会爬取微博的个人信息页面后,我们也可以尝试爬取QQ空间的个人登录页面html代码,小提示:需要带上referer(判断当前路径是不是由上一个路径进来的)~

十、Handler处理器

Handler处理器:定制更高级的请求头。随着业务逻辑的复杂,请求对象的定制已经满足不了我们的需求(动态cookie和代理不能使用请求对象的定制)

基本使用方法如下:

标签:10,请求,url,request,urllib,content,ajax,data,page
From: https://www.cnblogs.com/lxxa/p/18308439

相关文章

  • ORA-00756 ORA-10567故障处理---惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:ORA-00756ORA-10567故障处理作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]数据库异常断电之后,recover报ORA-00756ORA-10567等错SQL>recoverdatabase;ORA-00756:恢......
  • AP Calculus Unit 7-10
    Unit7:DifferentialequationsSlopefields对于常微分方程\(\frac{dy}{dx}=f(x,y)\),我们可以画出其斜率场。具体来说,选出一些点(例如原点附近的数百个整点),利用常微分方程画出每个点处的斜率。看起来会像是这样:有一个基于Desmos的Slopefield生成器:SlopeFieldGen......
  • Google Earth Engine(GEE)——北京地区简单的除云影像展示(云量小于10的影像展示)
    结果 函数:函数: ee.Algorithms.Landsat.simpleCloudScore(image)Computesasimplecloud-likelihoodscoreintherange[0,100]using......
  • AI Earth——MuSyQ 30m/10天叶片叶绿素含量产品(中国)应用 app
    应用介绍 ​​​​​​​30m/10天合成的叶片叶绿素含量产品是空天院多源协同定量遥感产品生产系统((Multi-sourcedataSynergizedQuantitativeremotesensingproductionsystem,MuSyQ))产品之一。叶片叶绿素含量(Chlleaf)是植被遥感监测中最重要的参数之一,目前国际上缺少高分......
  • Python实现基于http通信的protobuf数据传输的案例,包括请求者和接收者
    个人名片......
  • android开发基于Android10分析请求Zygote执行Fork一个新的应用程序的过程
    android开发基于Android10分析请求Zygote执行Fork一个新的应用程序的过程```ActivityTaskManagerService.activityPausedActivityStack.activityPausedLockedRootActivityContainer.resumeFocusedStacksTopActivitiesActivityStackSupervisor.startSpecificActivityLocked......
  • 题解 P1031 [NOIP2002 提高组] 均分纸牌
    link贪心题中描述每一堆牌只能移动若干张牌到相邻的牌堆上确定了局部最优解必定能推导出全局最优解。易知均分完后,每堆牌的数量都为纸牌总数的平均数\(\mathrm{arg}\)。所以我们可以预处理每堆牌跟\(\mathrm{arg}\)的差距for(inti=1;i<=n;++i)sum+=a[i];......
  • 1078 破密
    这个问题可以通过逐个解密字符的方式来解决。我们可以根据给定的加密规则,反向计算出原文的每个字符。以下是解题步骤:1.初始化变量:首先,我们需要初始化一个变量prev,用于存储上一个字符的密文的ASCII码。2.解密字符:然后,我们可以逐个解密字符。对于第一个字符,由于其密文与原......
  • 1016、基于数电电路交通灯数码管显示系统设计(Proteus仿真+元器件清单+配套资料等)
    毕设帮助、开题指导、技术解答(有偿)见文未一、设计功能1、通过纯数电硬件电路实现,两个方向通行时间分别为40s和55s,黄灯时间为5s,具有夜间模式,所有黄灯闪烁。2、通过数码管显示相关的信息二、Proteus仿真图资料包括:需要完整的资料可以点击下面的名片加下我,找我要资源......
  • 洛谷 P10716 【MX-X1-T4】「KDOI-05」简单的字符串问题
    洛谷传送门一个\(A\)合法的充要条件为:\(A\)为\(S_{1\simi}\)的一个border;\(A\)在\(S_{1\simi}\)中不重叠地出现\(\gek\)次。建出失配树后,发现合法的\(A\)在树上组成一条某个点\(u\)到根的链,且\(u\)为\(i\)的祖先。因此我们若知道\(u\),答案就是\(d......