五个实战演练
1、需求:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
爬取指定词条的整个网页
UA检测
UA伪装
1 # UA:User-Agent(请求载体的身份标识)
2 # UA检测:.门户网站的服务器会检测对应请求的载体身份标识.如果检测到请求的载体身份标识为某一款浏览器
3 # 说明该请求是一个正常的请求,如果检测到请求的载体身份标识不基于某款浏览器的,则表示该请求就很有可能
4 # 为不正常的请求,服务端就会拒绝该次请求。
5 #
6 # UA伪装:让爬虫对应的请求载体身份标识伪装成某一款浏览器
7 if __name__ == '__main__':
8 # UA伪装:将对应的Useer-Agent封装到一个字典中
9 headers = {
10 "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
11 }
12 url = "https://www.sogou.com/web"
13 # 处理URL的参数,封装到字典中
14 value = input("请输入一个关键词:")
15 param = {
16 "query":value,
17 }
18 # 使用以下方法把参数和UA伪装的头部封装到url中,并得到响应
19 response = requests.get(url=url,params=param,headers=headers )
20 text = response.text
21 filename = value+".html"
22 with open(filename,"w",encoding="utf-8") as f:
23 f.write(text)
24 print("保存成功")
2、需求:破解百度翻译
爬取需要翻译内容的ajax的响应
从网页的检查窗口的network中的XHR中可以看到ajax发送的请求,我们要做的就是模仿ajax向服务器发送请求,接收数据
post请求(携带了数据data)(需要翻译的内容)
响应的数据是json类型
1 if __name__ == '__main__':
2 # URL
3 url = 'https://fanyi.baidu.com/sug'
4 # 发送的数据
5 value = input("输入要翻译的关键词:")
6 data = {
7 'kw':value,
8 }
9 # UA伪装
10 headers = {
11 "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
12 }
13 # 发送请求
14 response = requests.post(url,data=data,headers=headers)
15 # 接收到的数据是一个json数据的话,才能用.json方法,返回的是一个json对象
16 dic_obj = response.json()
17 # 持久化存储 (存到文件中)
18 filename = value+".json"
19 f = open(filename,"w",encoding="utf-8")
20 json.dump(dic_obj,f,ensure_ascii=False)
21 f.close()
22 print("结束")
3、需求:爬取豆瓣电影分类排行榜https://movie.douban.com/中的电影详情数据
爬取某一部分电影的ajax的响应
get请求(携带了参数param)(从哪一部电影开始,一次请求多少个电影)
响应的数据是json类型
1 if __name__ == '__main__':
2 url = "https://movie.douban.com/j/chart/top_list"
3 param = {
4 'type': '24',
5 'interval_id': '100:90',
6 'action': "",
7 'start': '0', # 从第几个电影开始取
8 'limit': '20', # 一次取多少个电影
9 }
10 # UA伪装
11 headers = {
12 "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
13 }
14 # 发送get请求
15 response = requests.get(url=url,params=param,headers=headers)
16 # 接受json数据
17 dic_obj = response.json()
18 # 持久化储存
19 filename = '豆瓣喜剧电影'+param["start"]+"-"+param["limit"]+".json"
20 f = open(filename,"w",encoding="utf-8")
21 json.dump(dic_obj,f,ensure_ascii=False)
22 f.close()
23 print("结束")
4、需求:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数据
1 if __name__ == '__main__':
2 url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
3 city = input("请输入城市名:")
4 data = {
5 'cname':"",
6 'pid':"",
7 'keyword': city, # 城市名
8 'pageIndex': '1', # 第几页
9 'pageSize': '10', # 一页的个数
10 }
11 headers = {
12 "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
13 }
14 response = requests.post(url,data,headers)
15 text = response.text
16 filename = city + '.txt'
17 with open(filename,"w",encoding="utf-8") as f:
18 f.write(text)
19 print("结束")
5、需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据http://125.35.6.84:81
http://scxk.nmpa.gov.cn:81/xk/
-动态加载数据
-首页中对应的企业信息数据是通过ajax动态请求到的。
http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList
-通过对详情页url的观察发现:
- url的域名都是一样的,只有携带的参数(id)不一样
-id值可以从首页对应的ajax请求到的json中获取
- 域名和id值可以拼接成对应完整企业详情页的url
-详情页的企业详情数据也是动态加载出来的
- http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
-观察后发现
- 所有的post请求的url都是一样的,只有参数id值是不同。
- 如果我们可以批量获取多家企业的id后,就可以将id和url形成一个完整的详情页对应详情页的url
1 if __name__ == '__main__':
2 headers = {
3 "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
4 }
5 url_index = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList"
6 id_list = []
7 # 前五页的数据
8 for page in range(1,5):
9 page = str(page)
10 data = {
11 'on': 'true',
12 'page': page, # 当前页
13 'pageSize': '15', # 一页有多少条数据
14 'productName':'',
15 'conditionType': '1',
16 'applyname':'',
17 'applysn':'',
18 }
19 # 当前页的字典类型的json数据
20 json_dic_index = requests.post(url=url_index,headers=headers,data=data).json()
21 for i in json_dic_index["list"]:
22 id_list.append(i["ID"])
23 url_detail = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"
24 detail_list = []
25 for id in id_list:
26 data = {
27 "id":id,
28 }
29 json_dic_detail = requests.post(url=url_detail, headers=headers, data=data).json()
30 detail_list.append(json_dic_detail)
31 # 持久化存储
32 f = open("./化妆品企业详情.json","w",encoding="utf-8")
33 json.dump(detail_list,fp=f,ensure_ascii=False)
34 f.close()
35 print("结束")

浙公网安备 33010602011771号