爬虫 requests 模块

简单介绍requests 模块

 Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,Requests它会比urllib更加方便,可以节约我们大量的工作。

简单的使用例如:

# 爬取指定的网页
url = "https://philips-reporting.livecom.cn/admin/index.jsp"

respones = requests.get(url) # 发送请求
respones.encoding = "UTF-8" #爬取内容编码防止乱码
page_text = respones.text

with open("./live.html", "w", encoding="utf-8") as f: #持续性存储
    f.write(page_text) 

上面这段代码,将爬取下来的网页进行了保存。

那么我们 进行数据量级处理:

  1. 遇到对应的反爬机制,
  2. 反爬机制有:UA检测
    应对: 反反爬策略:UA伪装
    UA伪装:(1.定义一个字典 2.在字典中进行相关请求头的伪装 3.将伪装作用到get方法的headers参数中间即可)
  3. UA检测被作用到大量的网站当中,因此在爬取时一定要加上UA操作
import requests

url = "https://movie.douban.com/j/search_subjects"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}
param = {
    "type": "movie",
    "tag": "爱情",
    "sort": "recommend",
    "page_limit": 200,
    "page_start": 0,
}
response = requests.get(url, params=param, headers=headers)
move_list = response.json()

print(move_list)
dict = {}
for i in move_list.values():
    for j in i:
       print(f'{j["title"].replace(" ","")} {j["rate"]} 观看地址: {j["url"]}')

请求参数动态化:

最终实现请求参数动态化;

  1. 定义一个字典
  2. 字典中的键值对就是url 携带的参数
  3. 将字典作用到get 方法的params 方法中

来实现一个简单的需求;
爬取豆瓣电影的详情数据我们取电影名称,评分,以及电影地址:
分析可以得出:
1. 更多的数据请求是滚轮到达底部进行的ajax 请求。
2. 请求的url 进行捕获
3. url 的请求进行发送


url = "https://movie.douban.com/j/search_subjects"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}
param = {
   "type": "movie",
   "tag": "爱情",
   "sort": "recommend",
   "page_limit": 200, #取多少步 这里可以设置为可变
   "page_start": 0, 从哪一部开始
}
response = requests.get(url, params=param, headers=headers)
move_list = response.json() #数据转换

print(move_list)
dict = {}
for i in move_list.values():
   for j in i:
      print(f'{j["title"].replace(" ","")} {j["rate"]} 观看地址: {j["url"]}')

动态加载案例分析

概念:通过其他或另一个请求得到的数据
特性:非见非可见
判断相关数据是否是动态加载数据;
-基于抓包工具定位到浏览器地址栏url 对应的请求数据包,进行同步搜索,这组数据不是动态加载的可以直接爬取,没有搜取到这组数据是动态加载的,不介意直接爬取。
如何捕获动态加载数据
-基于抓包工具进行全局搜索,最终可以动态加载数据对应的数据包
实例:非动态加载

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}
params = {
    "cname": "上海",
    "pid": "",
    "keyword": "上海",
    "pageIndex": 1,
    "pageSize": 100,
}
url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"
response = requests.get(url,headers=headers,params=params)

kfc_store_address = response.json()
# print(kfc_store_address)

for i in kfc_store_address["Table1"]:
    # for j in i.items():
    print(f"店名:{i['storeName']} 地址: {i['provinceName']}{i['addressDetail']}")


-------------------------------------------------------------------------------------------
import requests
ids = []
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}
url = "http://125.35.6.84:81/xk/itownel/portalAction.do?method=getXkzsList"
for page in range(1,6):
    data={
       'on':'ture',
        'page':str(page),
        'pageSize':"15",
        'praductName':'',
        'conditionType':'1',
        'applyname':'',
        'applyan':''
    }
    company_daya_json = requests.post(url=url,headers=headers,data=data).json()
    for dic in company_daya_json["list"]:
        _id=dic["ID"]
        ids.append(_id)
detail_url = "http://125.35.6.84:81/xk/itownel/portalAction.do?method=getXkzsById"
for _id in ids:
    data = {
        "id":_id
    }
    company_Json = requests.post(url=url,headers=headers,data=data).json()
    print(company_Json["epsName"],company_Json["epsProductAddress"])
原文地址:https://www.cnblogs.com/wuzifan/p/14761000.html