1、基础知识
-urllib模块
-requests模块
作用:模拟浏览器发出请求。
如何使用:
-指定url
-发起请求
-获取响应数据
-持久化存储
环境安装:
pip install requests
使用案例
if __name__ == "__main__":
1、指定url
url = 'https://www.sogou.com/'
2、发起请求
response = requests.get(url=url)
3、获取响应数据
page_text = response.text
4、持久化保存
print(page_text)
with open('./sogou.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('爬取数据结束!!!')
2、实例1:网页采集器
对于url中的参数需要动态变化,以保证通用性,可以使用键值对存储。
if __name__ == "__main__":
#这里先指定url的前缀
url='https://www.baidu.com/s'
#我们要进行搜索时,wd=东南大学,wd和东南大学可以作为键值对来方便更改存储
my_keyword=input('enter a word:')
param={
'wd':my_keyword
}
#第一个参数是前缀,第二个参数是添加进url中的参数
response=requests.get(url=url,params=param)
response_txt=response.text
print(response_txt)
3、UA伪装:门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份标识是某一款浏览器,说明该请求是正常的请求,如果载体身份标识不是基于某一款浏览器,则表示该请求为不正常请求。需要将爬虫对应的请求载体身份标识伪装成某一款浏览器。
if __name__ == "__main__":
#添加身份标识
headers={
'User-Agent':'Mozilla / 5.0(WindowsNT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 114.0.0.0Safari / 537.36 Edg / 114.0.1823.51'
}
url='https://www.baidu.com/s'
my_keyword=input('enter a word:')
param={
'wd':my_keyword
}
#身份标识作为第三个参数,进行UA伪装,伪装成正常浏览器
response=requests.get(url=url,params=param,headers=headers)
response_txt=response.text
print(response_txt)
4、实例2:破解百度翻译
有的时候一张网页可能存在许多个框,但是我们只想获得其中的一个框的信息。
对于搜索框进行删除或者写入,会引起局部刷新,可以用ajax请求实现。所以说需要捕获阿贾克斯请求。可以按F12打开,查看网络
下面all代表全部的数据包,XHR代表阿贾克斯数据包。
可以发现在翻译栏输入dog,可以获得三个阿贾克斯数据包
点开负载,发现每个数据包都有一个字母
对应的请求是post请求(携带了参数),响应数据是一组json数据。
import requests
import json
if __name__ == "__main__":
#UA伪装
headers={
'User-Agent':'Mozilla / 5.0(WindowsNT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 114.0.0.0Safari / 537.36 Edg / 114.0.1823.51'
}
#url从标头中的’请求url‘中获得
url='https://fanyi.baidu.com/sug'
#参数构建,根据sug数据包的内容,参数字典对为kw:dog
data={
'kw':'dog'
}
#百度翻译的请求方法是post,第一个参数是url,第二个参数是请求携带的数据,是url中携带的参数
response=requests.post(url=url,data=data,headers=headers)
#json方法返回的是一个obj对象,如果确认响应类型是json类型的,才可以使用json(),可以从响应标头Content-Type获取
dic_obj=response.json()
#进行持久化存储
fp=open('./dog.json','w',encoding='utf-8')
json.dump(dic_obj,fp=fp,ensure_ascii=False)
fp.close()
5、案例3:豆瓣电影
豆瓣电影推荐向下拖动点加载更多会更新界面,所以会使用阿贾克斯请求,请求URL在图中。
每次点击加载更多都会出现一个GET请求。
GET请求的参数:
可以修改参数并发出请求来获得所需要的响应。
和前面类似,将requests.post()改成requests.get()即可。