您当前的位置:首页 > 计算机 > 编程开发 > Python

Python爬虫之requests模块

时间:10-19来源:作者:点击数:

Python爬虫 之 requests模块

简述get和post

requests主要有两个小的数据请求方式get和post
如何在网页上进行分辨呢?

1.可以直接在检查界面看到请求方式

啊啊啊啊啊

2.在检查界面看看是否有From Data数据,若有就是post,没有就是get

111111111

编码基本流程:

  1. 指定url
  2. 发起请求
  3. 获取响应数据
  4. 持续化储存

网址解析:

栗子:https://www.baidu.com/s?wd=孙一宁

?前可理解为目标网址总目录即https://www.baidu.com/s?

?后为搜索内容,相当于字典即:wd=孙一宁,‘wd’ 为字典的键,‘孙一宁’ 为值。

在requests.get/post中params/data使用参数,那么注意在url中对于params/data中字典键的去除。

(可能有朋友不耐烦了,啥玩意儿!!!)

表慌,栗子:

https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90
用该网址举三个例子:
1.param={}
response=requests.get(url='https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90                    	',
						params=param)

2. param={
		"type_name":"%E5%96%9C%E5%89%A7",
		"type":'24',
		"interval_id":'100:90'
			}
response=requests.get(url='https://movie.douban.com/typerank?'
						params=param)

3.param={
		"type_name":"%E5%96%9C%E5%89%A7",
		"type":'24',
			}
response=requests.get(url='https://movie.douban.com/typerank?interval_id=100:90
						params=param)

requests第一滴血–淘宝主界面

了解源码界面
淘宝
代码实现
#导库
import requests
#指定url
url="https://uland.taobao.com/"
#发送请求get(url, params=None, **kwargs)
response=requests.get(url=url,)
#转成文本数据
page_text=response.text
#打印出文本
print(page_text)

#存储数据
#只写打开文件,输入文本类型为utf-8
fp=open(file="./sou_gou_shu_ju.html",mode='w',encoding="utf-8")
#文本写入
fp.write(page_text)
fp.close()
print("爬爬爬over")

百度网页采集器

百度网址分析
有些小伙伴是这样的
https://www.baidu.com/?tn=11111111_6_dg
tn=11111111_6_dg直接删除
百度
  搜索后发现网页多了一个  &wd=李一桐  
  &  这是参数分隔符
  wd  参数名称
  李一桐 当然是我们搜索内容了 
  
  等!!!那我要是想看其他小姐姐怎么办!!!
  好家伙!李一桐姐姐不香了吗?安排!!!
  params/data登场
一桐
在这里插入图片描述
搜索动态代码实现
import requests
url="https://www.baidu.com/s?"

#自定义搜索内容
kw=input("想搜索啥子呢?")

#get中params参数预备
param={
    "wd":kw,
}
#注:不同浏览器键值不同,即wd不同,例如搜狗为query

#对于params参数,会在url后自动添加params字典中的键和值,即会自动添加 wd=kw 在url后,然后请求。
#当kw输入‘孙一宁’时,那么相当于url为"https://www.baidu.com/s?wd=孙一宁"
response=requests.get(url=url
                      ,params=param
                      ,)
                      
page_text=response.text
print(page_text)
#根据搜索内容确定保存文件名称file_name
file_name=kw+".html"
fp = open(file=file_name,mode='w+',encoding="utf-8")
fp.write(page_text)
fp.close()
print("爬爬爬over")

网页UA检测/伪装反反爬机制

UA预备知识
  • UA:User-Agent(请求载体身份标识)

  • UA检测 : 门户网站的服务器会检测对应请求的载体身份标识,如果载体身份标识为浏览器则正常运行。那么我们的爬虫程序可能会被阻止,那么我们要将爬虫伪装成UA浏览器标识。

  • 在以后爬去网站数据的时候,一般都需要UA伪装,因为大部分浏览器都会进行UA检测。

让我们看看User-Agent在哪吧

User-Agent

注:User-Agent同一个电脑浏览器一般是不变的哈

有了User-Agent,我们就能把UA检测按在地上摩擦!!!强暴。。。

UA伪装代码实现
import requests
url="https://www.baidu.com/s?"
header={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.5211 SLBChan/25"
}
kw=input("想搜索啥子呢?")
param={
    "wd":kw,
}

#headers参数填入身份标识
response=requests.get(url=url
                      ,params=param
                      ,headers=header
                      )                   
page_text=response.text
print(page_text)
#根据搜索内容确定保存文件名称file_name
file_name=kw+".html"
fp = open(file=file_name,mode='w+',encoding="utf-8")
fp.write(page_text)
fp.close()
print("爬爬爬over")

该程序即可在生成的文件中用浏览器直接打开,直接进入到搜索后的页面。

在这里插入图片描述

进入(右边的姐姐好漂亮,左边?):

结果

爬虫爬区百度翻译数据

预备知识
首先我们要了解百度翻译的机制(阿贾克斯请求):
 1. url的确定
 2. User-Agent的确定
 3. data数据内容
 4. response数据返回类型
 5. Request Method 请求方式

首先

阿贾克斯(Ajax):当我们在打开一个界面时输入相应的内容,并没有按下回车键,就会自动帮我们搜索相应的结果,这个过程就称为阿贾克斯请求。在电脑端的百度,谷歌等浏览器中经常见到。

(我们打开一个界面检查后,进入Network,在网址不改变的情况下看到的新Name就是阿贾克斯请求)

对于ajax响应数据通常是用json来解析数据

在进行阿贾克斯请求时网址是不变的啊!!!

在进行阿贾克斯请求时网址是不变的啊!!!

在进行阿贾克斯请求时网址是不变的啊!!!

在这里插入图片描述
response

注意:一定要先打开检查,后输入翻译内容!!!

因为name下有许多个目录,我们要挨个寻找 from date为我们输入的数据的Name,即sug,同时要注意response的内容是否为我们需要的。

  1. url的确定
  2. Request Method 请求方式
urlandmethod
  1. User-Agent的确定
  2. data数据内容
    qqqq
  3. response数据返回类型
    contenttype
一切准备就绪,开始破解强暴!!!
import json
import requests
#url的确定
url="https://fanyi.baidu.com/sug"
#User-Agent的确定
header={
    "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36 Edg/91.0.864.48"
}
#翻译数据
kw=input("想翻译啥子呢?")
#from data 的数据名为键,kw为值
data={
    "kw":kw
}
#请求方式不在是get,而是post
response=requests.post(url=url
                      ,data=data#同get里的params
                      ,headers=header
                      )

page_json=response.json()
print(page_json)
file_name=kw+"translate.html"
fp = open(file=file_name,mode='w',encoding="utf-8")
json.dump(page_json#储存数据
		,fp=fp#存储地址
		,ensure_ascii=False#是否以ASCLL内容格式存储,由于翻译内容包含汉字,而ASCLL中没有汉字,所以False.
		)
fp.close()#打开后一定要关闭文件,否则不能在文件中看到存储内容
print("爬爬爬over")

豆瓣电影排行

数据解析
  1. URL get type:
    shujujiexi
  2. User-Agent 和 params参数:
    asfasfsaf
  3. 别忘了瞄一眼结果啊在这里插入图片描述
整体数据代码实现
import json
import requests
url="https://movie.douban.com/j/chart/top_list?"
header={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.5211 SLBChan/25"
}
param={
    'type': '24'
    ,'interval_id': '100:90'
    ,'action':''
    ,'start': '0'#爬去开始位置
    ,'limit': '10'#每次爬取数据个数
}
response=requests.get(url=url
                      ,params=param
                      ,headers=header)

page_json=response.json()
print(page_json)

fp = open(file="dou_ban.json",mode='w+',encoding="utf-8")
json.dump(page_json,fp=fp,ensure_ascii=False)
fp.close()
print("爬爬爬over")

呢,十个object

json工具

什么玩意儿这一堆东西玩我呢???我只想要排名,什么都不要。

在这里插入图片描述

那么----------展开第一个object,哇哇哇!!!

类1
局部数据代码实现(排名)
import json
import requests
url="https://movie.douban.com/j/chart/top_list?"
header={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.5211 SLBChan/25"
}
param={
    'type': '24'
    ,'interval_id': '100:90'
    ,'action':''
    ,'start': '0'#爬去开始位置
    ,'limit': '10'#每次爬取数据个数
}
response=requests.get(url=url
                      ,params=param
                      ,headers=header)

movie_json=response.json()
fp = open(file="movie_rank.html",mode='w+',encoding="utf-8")

for each_movie in movie_json:
    json.dump([each_movie['rank'],each_movie['title']], fp=fp, ensure_ascii=False)
    fp.write('\n')

fp.close()
print("爬爬爬over")

看结果:

工作餐

over~~~

国家药品化妆品许可证企业公司详细信息

网址:

国家药品化妆品许可证管理系统

来喽!!!进局子喽。。。。

解析界面和数据位置

先看看界面

药品管理
v
寻找爬取数据内容位置方式一-----间接搜索

我们的目的爬取所有企业的详细数据信息,是不是感觉直接拿到网址就可以了???你太天真了!!!

来我替你试试

验证错误思路
import json
import requests
url="http://scxk.nmpa.gov.cn:81/xk/"
header={
    "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36 Edg/91.0.864.48"
}
response=requests.get(url=url
                      ,headers=header).text


fp = open(file="qqqqq.html",mode='w+',encoding="utf-8")
json.dump(response, fp=fp, ensure_ascii=False)
fp.close()
print("爬爬爬over")

也许你会得到:

aaaaaa

打开后:

乱码

神马鬼???

来,试试这个方法!!!

额额额额

点View就会看到想要的结果:

asfafsafafs

然后再把它粘贴到文件中

sdgdg

打开后

姐还是安分

突然感觉自己的电脑卡了一样。但是不要慌,你再等10年也是这样的!!!

那么麻烦,有没有简单的的办法???

当然!!!

试试这样:

嘘嘘

你会发现在那个response中没有你搜索的数据(0 of 0)。

说明仅仅直接爬取网址的思路行不通

正确引导

到这里我们开始怀疑他是否是一个阿贾克斯请求。

嘿!!!确实是!!!

(可以不在ALL下找,可在XHR下找阿贾克斯)

阿贾克斯

到这里有个小伙伴又说了:你写的这是什么玩意儿?那么麻烦,不玩了不玩了!!!

哎???别慌!!!从这开始就可以直接忽略前面那一段的BB,进行下面的方式二

寻找爬取数据内容位置方式二------直接搜索
孙菲菲

是不是非常简单

这时,你会发现在keyword下出现该我们搜索的文字内容,并且在portalAction下,说明portalAction下存在和《中山市泛华精细化学品有限公司》同级别的数据,portalAction*就是我们所苦苦寻找的!!!

在这里插入图片描述
准确位置的确定

放在json中验证一下

阿发方式发

原来数据就放在portalAction中的List中!!!

接下来:

我们发现就那么多信息怎么能满足我?我要一步步进入拿到所有详情数据!!!

但是我要如何通过该网址界面搜索到关于这些公司更多的信息呢?此时我们会发现在公司名字上面有一个ID

难道这就是突破问题的关键???确实是!!!

爬去详细信息的进入方式

来我们拿出两个公司详细界面的网址做一下对比

http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=edec7603b4c34048a5c4aa489bfee8f8
http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=cf17ff0d3eb442d6bbcf79efa9996050

对,没错,只有ID不同,那么我们可以通过阿贾克斯请求来获取每一个公司地址的ID,进而抓取其所有的信息!!!

那么问题紧接着又来,我们进入每一个公司信息界面后,他们的信息是通过什么储存的。然我们探索"亿"下

达芙妮

我想聪明的你又看出来了!!!没错又是阿贾克斯请求

在json中看看:

在这里插入图片描述

好了!!!数据位置已经定位完成。

正片开始了!!!

代码实现

先让我们对于以上分析过程做一个整体的概括。

  • 我们发现网址界面内容为动态数据下载,对应的企业信息,通过阿贾克斯动态请求得到
  • 然后通过详情页面的URL,发现域名一样,参数ID不一样,ID值可以从首页对应的阿贾克斯请求Jason自创中获取。域名和ID值拼接就可以得到完整的企业详情页面的URL。
  • 对于每个详情页面的URL都是一样的,只有参数ID不同,那么我们可以通过获取多家企业的ID,就可以将URL和ID形成完整的详情页面。
  • 最后对详情界面一一爬取

主页面参数

gvz
asfsf

详细页面参数

wfazsfas
wfefef
import json
import requests

# User-Agent:
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.5211 SLBChan/25"
}
# 主页面url
url_1 = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList"

ID_list = []  # 存储ID
detail_list = []  # 存储结果
for page in range(1, 6):
    """为了爬取第1到第5页所有公司数据"""
    data_1 = {
        'on': 'true'
        , 'page': page  # 爬去数据页数
        , 'pageSize': '15'  # 每次爬取数量
        , 'productName': ''
        , 'conditionType': '1'
        , 'applyname': ''
        , 'applysn': ''
    }
    response_1 = requests.post(url=url_1
                               , data=data_1
                               , headers=header
                               , ).json()
    for i in response_1['list']:
        ID_list.append(i['ID'])  # 将ID存入列表

# 目标详细数据界面url
url_2 = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"

for i in ID_list:
    data_2 = {
        id: i
        # 以id为参数搜索,注意不能ID,要和url_2界面From Data 名一致为小写
        # 而不是和url_1界面爬去数据的键名一致
    }
    response_2 = requests.post(url=url_2
                               , data=data_2
                               , headers=header).json()
    detail_list.append(response_2)
    # 结果存储在 detail_list 中
#有目的数据存储方式一
"""
fp = open('tail_', mode='w+', encoding='utf-8')
for each in detail_list:
    factoryName = each["epsName"]  # 公司名称
    businessPerson = each["businessPerson"]  # 负责人姓名
    address = each["epsAddress"]  # 公司地址
    json.dump([factoryName, businessPerson, address], fp=fp, ensure_ascii=False)
    fp.write('\n')
fp.close()
"""
#所有数据存储方式二
"""
fp = open('tail_', mode='w+', encoding='utf-8')
json.dump(detail_list, fp=fp, ensure_ascii=False)
fp.close()
"""
print("爬爬爬over")
百度图片

(这个还是大家自己理解吧)

import os
import requests
page = input('请输入要爬取多少页:')
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.5211 SLBChan/25"
}
url = 'https://image.baidu.com/search/acjson?'
n ,pn= 0,1
# pn是从第几张图片获取 百度图片下滑时默认一次性显示30张
for m in range(1, int(page) + 1):
    param = {
        'tn': 'resultjson_com',
        'logid': '8846269338939606587',
        'ipn': 'rj',
        'ct': '201326592',
        'is': '',
        'fp': 'result',
        'queryWord': '美女',
        'cl': '2',
        'lm': '-1',
        'ie': 'utf-8',
        'oe': 'utf-8',
        'adpicid': '',
        'st': '-1',
        'z': '',
        'ic': '',
        'hd': '',
        'latest': '',
        'copyright': '',
        'word': '美女',
        's': '',
        'se': '',
        'tab': '',
        'width': '',
        'height': '',
        'face': '0',
        'istype': '2',
        'qc': '',
        'nc': '1',
        'fr': '',
        'expermode': '',
        'force': '',
        'cg': 'girl',
        'pn': pn,
        'rn': '30',
        'gsm': '1e',
    }
    page_text = requests.get(url=url, headers=header, params=param)
    page_text.encoding = 'utf-8'
    page_text = page_text.json()
    data_list = page_text['data']

    data_list.pop(-1)
    image_loc_list = []
    for i in data_list:
        image_loc_list.append(i['thumbURL'])


    if not os.path.exists("./图片爬取"):
        os.mkdir("./图片爬取")

    for img_path in image_loc_list:
        img_data = requests.get(url=img_path, headers=header).content
        img_path = './图片爬取/' + str(n) + '.jpg'
        fp=open(img_path,"wb")
        fp.write(img_data)
        n = n + 1
    pn += 29

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门