python爬虫实战小项目5个及总结

使用VS2019
首先简单知识介绍:

  • UA =User-Agent(请求载体的身份标识)
  • UA检测:网站的服务器会检测对应请求的载体的身份标识,如果检测到为某一款浏览器,则该请求是个正常请求,但如果不是,则必定是个爬虫,则请求可能被拒绝。
  • UA伪装:让爬虫对应的身份标识伪装成某一款浏览器
  • User-Agent查看(右键web打开检查,点击搜索触发事件,网格(web)里找到页面,查看请求头那一项找到user-agent,就是当前使用的identical tag。

简易网页采集器

  1. 打开搜狗搜索,虽然输入关键字,会得到这样的地址:
    在这里插入图片描述
    (query之后的地址目前来说对我没什么用,可以不要)

  2. 复制地址,在程序中写入代码:

url = "https://www.sogou.com/web?query=%E6%AC%A7%E9%98%B3%E5%A8%9C%E5%A8%9C"

把地址修改为

url = "https://www.sogou.com/web?query=欧阳娜娜"
  1. 这个搜索的keyword可以是任意值,所以
url = "https://www.sogou.com/web"

kw = input("Enter a word:")
param ={
    
    
    'query':kw
    }
  1. 设定好url之后就要UA伪装(查看自己浏览器的UA即可)
header ={
    
    
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36 Edg/86.0.622.38'
    }
  1. 发送请求,get()返回值,之后永久性保存即可
#发送请求
response = requests.get(url=url,params=param,headers=header)

page_txt = response.text
filename = kw+'.html'
with open(filename,'w',encoding='utf-8') as fp:
    fp.write(page_txt)
print(filename+"保存成功")

爬百度翻译做简易翻译器

  1. 打开百度翻译,输入一个单词,没有按任何键盘比如ENTER,页面也会自动刷新(由ajax完成),打开检查,网络的XHR一栏,有sug文件,这就是刷新产生的文件
    在这里插入图片描述
    在这里插入图片描述
    它是一个POST请求,并且有一个仅有的参数kw,这个kw是我们输入的Cat的一部分,说明sug文件就是我们要找的url。预览一下就是翻译的内容。
    在这里插入图片描述
  2. 设置url
import requests
import json
#请求url
Post_url = 'https://fanyi.baidu.com/sug'
  1. UA伪装以及设置POST参数
header = {
    
    
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36 Edg/86.0.622.38'
    }

#Post请求参数处理
word = input('Enter your word: ')
data = {
    
    
    'kw':word
    }
  1. 请求发送
    在这里插入图片描述
    可以看到post函数参数有url、data就是你的参数,还有关键字变量headers
#请求发送
response = requests.post(url=Post_url,data=data,headers=header)
#获得json响应数据
receive_data = response.json()
print(receive_data)
#持久化存储
fp = open('./word.json','w',encoding='utf-8')
json.dump(receive_data,fp=fp,ensure_ascii = False)

print('over')

用json获取数据,因为响应头里的内容类型是json
在这里插入图片描述
dump函数需要注意的
在这里插入图片描述
在这里插入图片描述

爬豆瓣电影分类排行榜

  1. 打开豆瓣电影排行榜选择一个分类(我选择爱情),然后往下拉,拉到bottom会自动刷新页面(但地址不变,说明局部刷新,ajax),自动加载出更多影视信息,打开检查,网络-XHR会出现新的文件,这个文件就是ajax发起的文件。

  2. 打开那个文件,查看我们需要了解的信息
    在这里插入图片描述(是个get请求)
    在这里插入图片描述(内容类型是json)
    在这里插入图片描述
    (打开响应response可以看到电影详情信息)
    所以这就是我们需要的url

  3. 复制过去

import requests
import json

url = 'https://movie.douban.com/j/chart/top_list?type=13&interval_id=100%3A90&action=&start=20&limit=20'

又我们最好是把url的参数以字典的形式写出来,然后我们往下拉文件信息可以看到参数信息,copy过去

在这里插入图片描述

import requests
import json

url = 'https://movie.douban.com/j/chart/top_list'

param ={
    
    
    'type': '13',
    'interval_id': '100:90',
    'action': '',
    'start': '1', #从第几个电影开始取
    'limit': '20',  #一次取多少个电影
    }
  1. 写UA伪装和请求以及存储,首先是个get请求,然后由响应可以得知返回一个list列表
headers = {
    
    
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36 Edg/86.0.622.38'
    }

response = requests.get(url=url,params=param,headers=headers)
list_data = response.json()

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

print('over!')
  1. 解析json文件:百度搜索json,打开第一个在线解析。
    在这里插入图片描述
    在这里插入图片描述

爬肯德基餐厅查询地址

  1. 打开肯德基官网,餐厅地址查询
    在这里插入图片描述

  2. 输入地址位置,观察看地址有没有变化,如果没有变化则说明是个ajax发起的请求,如果变化则地址就是url。
    在这里插入图片描述
    (结果是地址没有变化,所以这是个ajax发起的请求,在网络的XHR中找到相关文件,步骤同豆瓣项目相似,相关信息如下)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    说明pageIndex是个变量,1-2,keyword也可以是个变量。

  3. 代码书写如下:

import requests

url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"
keyword  = input('Enter the city name ')

param = {
    
    
    'cname':'',
    'pid':'',
    'keyword':keyword,
    'pageIndex': '1',
    'pageSize': '10',
    }


headers = {
    
    
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36 Edg/86.0.622.38'
    }

response = requests.post(url=url,params=param,headers=headers)
list_data = response.text
print(list_data)

with open('./KFC.txt','w',encoding='utf-8') as fp:
    fp.write(list_data)

print('OK!')
  1. 用json在线解析:
    在这里插入图片描述

药品监管局

  1. 首先要确定url
    web:化妆品
    在这里插入图片描述
    说明地址一栏的地址不是要搜寻的url。
    所以这些数据(企业名称,有超链接的)是动态加载而来的,再去查看是否是ajax请求,利用动态抓包验证
    在这里插入图片描述
    刷新一下,发现XHR出现一个文件,而这个文件正是我们想要的
    在这里插入图片描述
    在这里插入图片描述
    会发现每家企业都会有一个ID值,打开企业的超链接
    在这里插入图片描述
    所以一个办法就是通过这个ID参数来打开企业的详细页,然后抓取详细数据。
    各企业的详细页只是参数不一样,域名是一样的,可以拼接。
    打开超链接,验证url会发现详情页的数据也是动态加载而来的
    在这里插入图片描述
    打开XHR那个文件可以发现详情页url的参数有ID,然后观察多个企业的url,发现url都一样,只是ID不同,所以各个POST请求用一样的url,ID不一样!
    在这里插入图片描述

所以:
我们通过首页的url获取id值,然后通过详细页的url+不同的ID获取不同企业的详细页数据。
解析json:
在这里插入图片描述首先是一个字典,字典有个key是’list’,值是一个list,list里有多个dict,每个dict有一个key叫id

代码:

import requests
import json

url_1 = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
headers = {
    
    
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36 Edg/86.0.622.38'
    }

param = {
    
    
    'on': 'true',
    'page': '1',
    'pageSize': '15',
    'productName':'', 
    'conditionType': '1',
    'applyname':'', 
    'applysn':'', 
    }

id_list = [] #用来存储id
detail_list = [] #存储数据
response_ids = requests.post(url=url_1,params=param,headers=headers).json() #是一个dict
for dict in response_ids['list']: #每一个dict里有个key叫id
    id_list.append(dict['ID'])

url_2 = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
for id in id_list:
    data ={
    
    
        'id':id
        }
    response = requests.post(url=url_2,headers=headers,data=data).json()
    fp = open('./huazhuangpin.json','a',encoding='utf-8')
    detail_list.append(response)
    json.dump(detail_list,fp,ensure_ascii=False)
    

print('OK!')

总结

requests模块使用流程

  1. 指定url
    确定url的方法可以是通过抓包的方法验证是否是正确的url。
    比如:打开检查,刷新页面,找到网址,看响应里有没有你想要的元素(CTRL+F查看),如果有,则这个url可能就是你想要的url。如果不是,检查有没有可能的Ajax局部刷新,XHR一栏里。一般查找url就是这两地方。

  2. UA伪装

  3. 参数设置
    可以拉到header的一栏看有没有参数,如果有就编写参数的dict。一般Get函数需要你为params写参数;Post需要你为data写参数。

  4. 发送请求
    requests.get(…)或者requests.post(…)发送请求获得响应,用一个变量去接收
    response = requests.get(url=url,params=param,headers=headers)

  5. 获取响应数据
    然后查看存储内容的类型utf-8或者json或者text呀,然后用一个变量去接收数据content = response.json()

  6. 存储处理
    with open('./xxx.json','w',encoding='utf-8') as fp: fp.write(content)

关于数据是什么形式的,可以在响应里复制整个内容,然后打开JSON在线编译去看,字典呀,列表呀,然后找到你想要的。

猜你喜欢

转载自blog.csdn.net/ZmJ6666/article/details/109073708
今日推荐