嘎嘎谢谢你们的点赞!
首先要import requests库,在终端terminal中输入pip install requests即可安装。
整理一下爬取的思路:
1.指定url
2.UA(User-Agent)伪装 (headers)
3.发起请求 (get/post)
4.获取响应的请求 (text/json())
5.进行数据解析 (正则,bs4, xpath*)
6.持久化存储数据 (json.dump(),保存为json文件)
现在做个简单的搜狗页面爬取:
import requests
# UA 即User-Agent(请求载体(浏览器)的身份标识)
# 我们当前的载体是爬虫程序
# UA伪装:门户网站的服务器会检测对应请求的载体身份标识,如果检测到身份载体身份标识为浏览器,
# 意味着请求为正常请求,如果检测到载体身份标识不是浏览器,则是不正常请求(基于爬虫),服务器端可能拒绝该次请求
if __name__ == "__main__": # 程序入口
# UA伪装
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0"
} # 将载体的身份标识伪装成浏览器
# 指定url
url = "https://www.sogou.com/web"
kw = input("enter a word:")
param = {
"query": kw
}
# 对指定的url发起请求,对应的url是携带参数的,并且在请求过程中处理了参数(动态拼接参数)
response = requests.get(url=url, params=param, headers=headers) #param可以是字典、列表、元组等
page_text = response.text # 获取响应数据 是json类型可以使用json()
filename = kw+".html"
# 持久化保存数据
with open(filename, "w", encoding="utf-8") as fp:
fp.write(page_text)
print("{}保存完成!".format(filename))
# over!
下面是破解百度翻译
import requests
import json
if __name__ == '__main__':
# 1.指定url
# 此处有Ajax请求,Ajax: 能够刷新指定的页面区域,而不是刷新整个页面,
post_url = "https://fanyi.baidu.com/sug" # 筛选XHR
# 2.UA伪装
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0"
}
# 3.post请求参数处理(和get是一致的)
word = input("please enter a word:")
# 此处输入要查询的单词
data = {
"kw": word
}
# 4.请求发送
response = requests.post(post_url, data=data, headers=headers)
# 5.获取响应数据(确认响应数据是json类型的才可以使用json())
dict_obj = response.json()
# 6.持久化存储
with open("./{}.json".format(word), "w", encoding="utf-8") as fp:
json.dump(dict_obj, fp=fp, ensure_ascii=False)
print("{}.html文件保存完成".format(word))
下面是爬取药监局各个企业的相关数据
import requests
import json
import time
if __name__ == "__main__":
url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0"
}
id_list = []
all_data = []
for page in range(1,3): # 爬取1-3页的内容
time.sleep(2) # 防止请求过快
page = str(page)
data = {
"on": "true",
"page": page,
"pageSize": "15",
"productName": "",
"conditionType": "1",
"applyname": "",
}
response = requests.post(url=url, data=data, headers=headers).json()
# 获取各个企业的ID
for dic in response["list"]:
id_list.append(dic["ID"])
# 获取企业详细数据
post_url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"
# 可见不同企业的页面url都相同,唯一的不同是id,
# 所以我们获取每个企业的id,通过for循环来爬取各个企业数据
for id in id_list:
time.sleep(2)
data = {
"id": id
}
id_json = requests.post(url=post_url, data=data, headers=headers).json()
all_data.append(id_json)
# 持久化存储
filename = "all_data.json"
with open(filename, "w", encoding="utf-8") as fp:
json.dump(all_data, fp, ensure_ascii=False)
print("over.")