一、requests模块
- urllib 模块 【比较古老的模块,已经被requests模块取代】
- requests 模块 : python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高
使用流程
- 指定url
**url = "目标地址"**
**
- 发起请求 get/post ,返回一个响应对象
**response = requests.get(url = url)**
**response.encoding="utf-8" # 修改响应对象的字符集**
- 获取响应数据 [请求对象.text 属性]
**page_text = response.text**
- 持久化存储数据
**file = open("./新建文件名.html","w" encoding=" utf-8")**
**file.write(text)**
**file.close()**
3、爬虫简单使用
import requests
if __name__ == '__main__':
# 指定爬取网址
url = "https://www.baidu.com/"
# 发起请求
response = requests.get(url=url)
# 修改响应的字符集
response.encoding = "utf-8"
# 获得爬取的信息
page_text = response.text
# 持久化
file = open("./vip.html", "w", encoding="utf-8")
file.write(page_text)
file.close()
print("爬取数据完毕")
二、爬取指定词条的搜索结果页面 (网页采集器) 指定关键字搜索爬虫
1、UA检测:
门户网站的服务器回检测对应请求的载体身份标识,如果检测到请求的载体身份标识位某一款浏览器,那么这次请求一定是一个正常的请求。但是如果检测到请求的载体身份标识不是某一款浏览器的,则表示该次请求为不正常的请求(爬虫),服务器端很有可能拒绝该次请求
2、UA伪装:User-Agent(请求载体的身份标识)
让爬虫对应的请求载体身份标识伪装城某一款浏览器
import requests
if __name__ == '__main__':
# UA伪装:将对应的User-Agent 封装到一个字典中
# 从浏览器中 复制一个user-agent 过来,然后存到字典中
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/85.0.4183.121 Safari/537.36 "
}
# 处理url携带的参数 query的参数
url = "https://www.sogou.com/web"
# 将url携带的参数封装到字典中
kw = input("请输入要搜寻的关键字:")
param = {
"query": kw
}
# 现在对指定的url 发起的请求,url是携带参数的,并且请求过程中处理了参数
# 第二个参数:是查询中的参数
# 第三个参数:是浏览器的User-Agent 请求头参数 UA 伪装
response = requests.get(url=url, params=param, headers=headers)
page_text = response.text
file_name = kw + ".html"
with open(file_name, "w", encoding="utf-8") as fl:
fl.write(page_text)
print(file_name, " 爬取完毕")
三、破解百度翻译 (爬取 POST请求返回的json数据)
- 在百度翻译的页面中输入 单词之后,会自动的发送AJAX请求 更新页面中的局部内容
- 每次输入一个字符,就会发送一个AJAX请求,如果输入abc 会有3个XHR请求
- 服务器响应回来的数据类型格式 application/json
- post 请求,携带了参数 “kw” : “单词”
import requests
# 导入json的包
import json
if __name__ == '__main__':
# 1.指定url post请求地址在开发者工具那里看
post_url = "https://fanyi.baidu.com/sug"
e = input("输入要翻译的中文:")
data = {
"kw": e
}
# 在请求之前进行UA伪装
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/85.0.4183.121 Safari/537.36 "
}
# 2.发送post请求
# data形参:接收一个字典,字典里面存放了数据
# headers形参:UA伪装
response = requests.post(url=post_url, data=data, headers=headers)
# 3. 因为返回的是json数据,所以方法名是json(),返回一个字典对象
# 如果确认响应数据是json 类型的 才可以使用json() 接收返回的数据
dict_obj = response.json()
# 存储文件名
file_name = e + ".json"
# 4. 进行持久化存储,直接存储成json格式的文件
# json包下的dump()方法将信息写入到json格式的文本中
# 第一个参数是字典变量,第二个参数是是一个open()返回的对象,第三个参数 表示禁用ascii 编码
file = open(file_name, "w", encoding="utf-8")
json.dump(dict_obj, fp=file, ensure_ascii=False)
print("数据爬取结束")
四、练习
1、爬取豆瓣电影的电影排行榜 (AJAX发送get请求,json数据)
import requests
import json
if __name__ == '__main__':
# 1.指定url
url = "https://movie.douban.com/j/chart/top_list"
# 指定携带参数
dict_info = {
"type": "5",
"interval_id": "100:90",
"action": "",
"start": "0", # 从库中第几部电影去取
"limit": "100" # 一次性取出来多少个
}
# UA 伪装
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/85.0.4183.121 Safari/537.36 "
}
# 2.发送get请求
response = requests.get(url, dict_info, headers=headers)
# 3.获取响应数据
dict_obj = response.json()
# 4.处理响应数据
file = open("douban.json", "w", encoding="utf-8")
json.dump(dict_obj, fp=file, ensure_ascii=False)
print("豆瓣排行榜爬取完毕")
2、爬取国家药品管理总局 化妆品生产许可证相关数据
此页面在加载完毕的时候会发送AJAX请求,向后端发送请求
动态加载数据 : 由ajax或其他异步通信方式 发送请求 获取数据
通过ajax 普通爬取后,发现爬到的数据只有 名字,和id 等垃圾信息,没有 许可证信息
通过企业名称进去后,发现路径是 :http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=b47a8488b1a640f0b46cdc73d71fa244
通过id来获取许可证详细信息【详情页的数据也是动态获取的 通过id值】
所以得出:可以批量获取多家企业的id后【通过第一次爬取的json串中的 id值】,然后再通过id爬取更详细的信息
import requests
import json
if __name__ == '__main__':
url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList"
# UA 伪装
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/85.0.4183.121 Safari/537.36 "
}
# 用来存储所有的企业详情数据 列表
all_data_list = []
params = {
"on": "true",
"page": "1",
"pageSize": "15",
"productName": "",
"conditionType": "1",
"applyname": "",
"applysn": "",
}
# 发送post请求
response = requests.post(url, params=params, headers=headers)
response.encoding = "utf-8"
# 返回一个字典
info_json = response.json()
# 通过查看json 发现里面有一个List list里面有id
info_list = info_json["list"]
# 通过遍历 获得id,
for x in info_list:
info_id = x["ID"]
url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"
# 将获取的id值 封装到字典中
new_data = {
"id": info_id
}
# 发送post请求
new_response = requests.post(url=url, data=new_data, headers=headers)
# 得到爬取的数据
dict_json = new_response.json()
# 将爬到的数据【字典】 追加到外面的列表中
all_data_list.append(dict_json)
# 将爬取的数据 追加写入到 文件中
fl = open("国家药品.json", "w", encoding="utf-8")
json.dump(all_data_list, fp=fl, ensure_ascii=False)
fl.close()
print("爬取完毕")