Python爬虫之Requests模块巩固深入案例

本文详细介绍了Python requests模块在网页采集中的应用,包括设置User-Agent避免被识别为爬虫,实现网页搜索、翻译、电影信息、餐厅位置和药品数据的爬取。通过实例展示了如何处理GET和POST请求,解析JSON数据,以及动态加载数据的抓取。内容覆盖了网络请求的基础和进阶技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

requests实战之网页采集器

User-Agent:请求载体的身份标识。
网站的服务器会检测对应请求的载体身份标识,如果检测到的载体身份标识为浏览器的话,就可以通过,反之,它会认出这是一个爬虫,就会无法被拒绝。

User-Agent的获取方法:
在浏览器主页点击鼠标左键,选择检查,或直接使用
在这里插入图片描述
requests实战之网页采集器代码

import requests
if __name__ == '__main__':
	#UA伪装:将对应的User-Agent封装到一个字典中
	headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67"}
	url="https://www.sogou.com/web?"
	#处理url携带的参数:封装到字典中
	kw=input('enter a word:')
	param={
		"query":kw
	}
	#对指定的url发起的请求对应的url是携带参数的,并且请求过程中处理了参数
	reponse = requests.get(url=url,params=param,headers=headers)

	page_text = reponse.text
	filename = "D:/"+kw+".html"

	with open(filename, "w", encoding = 'utf-8') as f:
		f.write(page_text)
	print("爬取数据结束,保存成功")

requests实战之破解百度翻译

post-url的获取方法:
因为这个包的请求方法为post请求方式(使用方法与get一致)
在这里插入图片描述
sug的区分方法:
因为它会出现许多sug,我们光凭表面无法判断到底是哪个,我们可以一个一个的点开看一下它们的from data在这里插入图片描述
使用json()的原则:
在这里插入图片描述
requests实战之破解百度翻译代码

import requests
import json
if __name__ == '__main__':
	#1.指定url
	post_url = "https://fanyi.baidu.com/sug"
	#2.进行UA伪装
	headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67"}
	#post请求参数处理(同get请求一致)
	word = input("请输入单词:")
	data = {
		"kw":word
	}
	#4.发送请求
	response = requests.post(url = post_url,data = data)
	
	#5.获取响应数据:json()方法返回的是obj (如果确认响应数据是json类型的,才可以使用json())
	dic_obi = response.json()
	#print(dic_obi)  下面的第6步也可以不用,直接使用这个print输出翻译的结果
	
	#6.持久化存储
	f = open("D:/dog.json","w",encoding = 'utf-8')
	json.dump(dic_obi,fp= f,ensure_ascii = False) #因为我们要拿到的是中文,中文是不能用ASCII编码的,所以我们要用False;

	print("打印完成")

requests实战之豆瓣电影爬取

所需数据的提取方法:
我们的url后面的参数一般可以直接用字典封装起来。而所需的url及其参数如图所示。
在这里插入图片描述
在这里插入图片描述
requests实战之豆瓣电影爬取代码

import requests
import json
if __name__ == '__main__':
	url = 'https://movie.douban.com/j/chart/top_list?' #后面的参数使用字典封装起来
	param = {
		'type': '24',
		'interval_id':'100:90',
		'action':'' ,
		'start': '1',  #从库中的最几步去取
		'limit': '20'  #一次取出的个数
	}

	headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67"}
	response = requests.get(url = url ,params=param,headers=headers)
	list_data= response.json()

	fp = open('D:/douban.json','w',encoding = 'utf-8')
	json.dump(list_data,fp=fp,ensure_ascii=False)

	print("over!!!")

requests实战之肯德基餐厅位置爬取

易错点:

  • 把”http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword“写为”http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?“,这易导致运行结果出错,如图:在这里插入图片描述
  • textjson使用分不清,我们只需要看它的Type类型就可以了,如图所示,它的类型为text类型。在这里插入图片描述
  • 如果你在输入不同词条时,它的url值不变,我们则需要Fetch/XHR中获得我们所需的请求头。

requests实战之肯德基餐厅位置爬取代码

import requests
if __name__ == '__main__':
	#1.指定url
	url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'

	#UA伪装:将对应的User-Agent封装到一个字典中
	headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67"}
	
	#封装数据
	position = input("请输入地址:")
	for i in range(1,11):
		page=str(i)
		data={
			'cname':'', 
			'pid':'', 
			'keyword': position,
			'pageIndex': 'page',  #当前页码
			'pageSize': '10'   #一页里面有多少条数据
		}
		#3.发送请求
		reponse = requests.post(url = url,data = data,headers = headers)

		#4.获取响应数据
		dizhi = reponse.text
		#print(dizhi)
		filename = "D:/地址第"+str(page)+"页.html"
		with open(filename,"w",encoding='utf-8') as f:
			f.write(dizhi)
		print("打印完成")

requests实战之药监总局相关数据爬取

  • 需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据

  • 链接:http://scxk.nmpa.gov.cn:81/xk/

    • 动态加载数据
    • 首页中对应的企业信息数据是通过ajax动态请求到的。
  • http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=006b7bbf272c44ce9e5cc4607771df2c		
    
  • http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=8605c0a721b7429baf2e42ba57bcaac3
    
    • 对比可知:
      - url的域名是一样的,ID不一样
      - id值可以从首页对应的ajax中获取
      - 域名和ID值拼接在一起才是一个完整的企业对应详情页的url
    • 详情页的企业详情数据也是动态加载出来的
    • http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
    • http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
    • 观察后发现:
      • 所有的post请求的url都是一样的,只是ID值不一样
      • 如果我们可以批量获得多家企业的id后,就可以将id和url形成一个完整的详情页对应的url

requests实战之药监总局相关数据爬取代码:

import requests
if __name__ == '__main__':
	#批量获取不同企业的id值(首页面的url)
	url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'

	#首页面的参数封装
	data = {
		'on': 'true',
		'page': '1',
		'pageSize': '15',
		'productName':'', 
		'conditionType': '1',
		'applyname':'', 
		'applysn':'' 
	}
	headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67"}
	
	id_list = []  #存储企业的id
	all_data_list = []  #存储所有的企业详情数据
	json_list = requests.post(url= url,headers = headers,data = data).json()
	for dic in json_list['list']:
		id_list.append(dic['ID'])

	#获取企业详情数据
	post_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
	for id in id_list:
		data = {
			'id':id
		}
		data_json = requests.post(url = url,headers = headers,data= data).json()
		print(data_json)
	#持久型存储all_data_list(未进行分页操作,说明只爬取了第一页)
	f = open("D:?allData.json",'w',encoding = 'utf-8')
	json.dump(all_data_list,fp=f,ensure_ascii=False)
	print("over!!!")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值