requests主要有两个小的数据请求方式get和post
如何在网页上进行分辨呢?
1.可以直接在检查界面看到请求方式
2.在检查界面看看是否有From Data数据,若有就是post,没有就是get
栗子: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)
#导库
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:User-Agent(请求载体身份标识)
UA检测 : 门户网站的服务器会检测对应请求的载体身份标识,如果载体身份标识为浏览器则正常运行。那么我们的爬虫程序可能会被阻止,那么我们要将爬虫伪装成UA浏览器标识。
在以后爬去网站数据的时候,一般都需要UA伪装,因为大部分浏览器都会进行UA检测。
让我们看看User-Agent在哪吧
注:User-Agent同一个电脑浏览器一般是不变的哈
有了User-Agent,我们就能把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来解析数据
在进行阿贾克斯请求时网址是不变的啊!!!
在进行阿贾克斯请求时网址是不变的啊!!!
在进行阿贾克斯请求时网址是不变的啊!!!
注意:一定要先打开检查,后输入翻译内容!!!
因为name下有许多个目录,我们要挨个寻找 from date为我们输入的数据的Name,即sug,同时要注意response的内容是否为我们需要的。
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")
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
什么玩意儿这一堆东西玩我呢???我只想要排名,什么都不要。
那么----------展开第一个object,哇哇哇!!!
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~~~
网址:
来喽!!!进局子喽。。。。
先看看界面
我们的目的爬取所有企业的详细数据信息,是不是感觉直接拿到网址就可以了???你太天真了!!!
来我替你试试
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")
也许你会得到:
打开后:
神马鬼???
来,试试这个方法!!!
点View就会看到想要的结果:
然后再把它粘贴到文件中
打开后
突然感觉自己的电脑卡了一样。但是不要慌,你再等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中看看:
好了!!!数据位置已经定位完成。
正片开始了!!!
先让我们对于以上分析过程做一个整体的概括。
主页面参数
详细页面参数
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