一、requests模块

  • urllib 模块 【比较古老的模块,已经被requests模块取代】


  • requests 模块 : python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高
    • 作用:模拟浏览器发请求

      1、requests模块如何使用

      首先通过pip 安装 requests 模块
      pip install requests

使用流程

  • 指定url
  • 基于requests 模块发起请求
  • 获取响应对象中的数据值
  • 持久化存储

    2、使用requests编码流程:

  1. 指定url

**url = "目标地址"**
**

  1. 发起请求 get/post ,返回一个响应对象

**response = requests.get(url = url)**
**response.encoding="utf-8" # 修改响应对象的字符集**

  1. 获取响应数据 [请求对象.text 属性]

**page_text = response.text**

  1. 持久化存储数据

**file = open("./新建文件名.html","w" encoding=" utf-8")**
**file.write(text)**
**file.close()**

3、爬虫简单使用

  1. import requests
  2. if __name__ == '__main__':
  3. # 指定爬取网址
  4. url = "https://www.baidu.com/"
  5. # 发起请求
  6. response = requests.get(url=url)
  7. # 修改响应的字符集
  8. response.encoding = "utf-8"
  9. # 获得爬取的信息
  10. page_text = response.text
  11. # 持久化
  12. file = open("./vip.html", "w", encoding="utf-8")
  13. file.write(page_text)
  14. file.close()
  15. print("爬取数据完毕")

二、爬取指定词条的搜索结果页面 (网页采集器) 指定关键字搜索爬虫

1、UA检测:

门户网站的服务器回检测对应请求的载体身份标识,如果检测到请求的载体身份标识位某一款浏览器,那么这次请求一定是一个正常的请求。但是如果检测到请求的载体身份标识不是某一款浏览器的,则表示该次请求为不正常的请求(爬虫),服务器端很有可能拒绝该次请求

2、UA伪装:User-Agent(请求载体的身份标识)

让爬虫对应的请求载体身份标识伪装城某一款浏览器

  1. import requests
  2. if __name__ == '__main__':
  3. # UA伪装:将对应的User-Agent 封装到一个字典中
  4. # 从浏览器中 复制一个user-agent 过来,然后存到字典中
  5. headers = {
  6. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
  7. "Chrome/85.0.4183.121 Safari/537.36 "
  8. }
  9. # 处理url携带的参数 query的参数
  10. url = "https://www.sogou.com/web"
  11. # 将url携带的参数封装到字典中
  12. kw = input("请输入要搜寻的关键字:")
  13. param = {
  14. "query": kw
  15. }
  16. # 现在对指定的url 发起的请求,url是携带参数的,并且请求过程中处理了参数
  17. # 第二个参数:是查询中的参数
  18. # 第三个参数:是浏览器的User-Agent 请求头参数 UA 伪装
  19. response = requests.get(url=url, params=param, headers=headers)
  20. page_text = response.text
  21. file_name = kw + ".html"
  22. with open(file_name, "w", encoding="utf-8") as fl:
  23. fl.write(page_text)
  24. print(file_name, " 爬取完毕")

三、破解百度翻译 (爬取 POST请求返回的json数据)

  • 在百度翻译的页面中输入 单词之后,会自动的发送AJAX请求 更新页面中的局部内容


  • 每次输入一个字符,就会发送一个AJAX请求,如果输入abc 会有3个XHR请求


  • 服务器响应回来的数据类型格式 application/json


  • post 请求,携带了参数 “kw” : “单词”
  1. import requests
  2. # 导入json的包
  3. import json
  4. if __name__ == '__main__':
  5. # 1.指定url post请求地址在开发者工具那里看
  6. post_url = "https://fanyi.baidu.com/sug"
  7. e = input("输入要翻译的中文:")
  8. data = {
  9. "kw": e
  10. }
  11. # 在请求之前进行UA伪装
  12. headers = {
  13. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
  14. "Chrome/85.0.4183.121 Safari/537.36 "
  15. }
  16. # 2.发送post请求
  17. # data形参:接收一个字典,字典里面存放了数据
  18. # headers形参:UA伪装
  19. response = requests.post(url=post_url, data=data, headers=headers)
  20. # 3. 因为返回的是json数据,所以方法名是json(),返回一个字典对象
  21. # 如果确认响应数据是json 类型的 才可以使用json() 接收返回的数据
  22. dict_obj = response.json()
  23. # 存储文件名
  24. file_name = e + ".json"
  25. # 4. 进行持久化存储,直接存储成json格式的文件
  26. # json包下的dump()方法将信息写入到json格式的文本中
  27. # 第一个参数是字典变量,第二个参数是是一个open()返回的对象,第三个参数 表示禁用ascii 编码
  28. file = open(file_name, "w", encoding="utf-8")
  29. json.dump(dict_obj, fp=file, ensure_ascii=False)
  30. print("数据爬取结束")

四、练习

1、爬取豆瓣电影的电影排行榜 (AJAX发送get请求,json数据)

未命名图片.png

  1. import requests
  2. import json
  3. if __name__ == '__main__':
  4. # 1.指定url
  5. url = "https://movie.douban.com/j/chart/top_list"
  6. # 指定携带参数
  7. dict_info = {
  8. "type": "5",
  9. "interval_id": "100:90",
  10. "action": "",
  11. "start": "0", # 从库中第几部电影去取
  12. "limit": "100" # 一次性取出来多少个
  13. }
  14. # UA 伪装
  15. headers = {
  16. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
  17. "Chrome/85.0.4183.121 Safari/537.36 "
  18. }
  19. # 2.发送get请求
  20. response = requests.get(url, dict_info, headers=headers)
  21. # 3.获取响应数据
  22. dict_obj = response.json()
  23. # 4.处理响应数据
  24. file = open("douban.json", "w", encoding="utf-8")
  25. json.dump(dict_obj, fp=file, ensure_ascii=False)
  26. print("豆瓣排行榜爬取完毕")

2、爬取国家药品管理总局 化妆品生产许可证相关数据

未命名图片.png

此页面在加载完毕的时候会发送AJAX请求,向后端发送请求

动态加载数据 : 由ajax或其他异步通信方式 发送请求 获取数据

通过ajax 普通爬取后,发现爬到的数据只有 名字,和id 等垃圾信息,没有 许可证信息

通过企业名称进去后,发现路径是 :http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=b47a8488b1a640f0b46cdc73d71fa244

通过id来获取许可证详细信息【详情页的数据也是动态获取的 通过id值】

所以得出:可以批量获取多家企业的id后【通过第一次爬取的json串中的 id值】,然后再通过id爬取更详细的信息

  1. import requests
  2. import json
  3. if __name__ == '__main__':
  4. url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList"
  5. # UA 伪装
  6. headers = {
  7. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
  8. "Chrome/85.0.4183.121 Safari/537.36 "
  9. }
  10. # 用来存储所有的企业详情数据 列表
  11. all_data_list = []
  12. params = {
  13. "on": "true",
  14. "page": "1",
  15. "pageSize": "15",
  16. "productName": "",
  17. "conditionType": "1",
  18. "applyname": "",
  19. "applysn": "",
  20. }
  21. # 发送post请求
  22. response = requests.post(url, params=params, headers=headers)
  23. response.encoding = "utf-8"
  24. # 返回一个字典
  25. info_json = response.json()
  26. # 通过查看json 发现里面有一个List list里面有id
  27. info_list = info_json["list"]
  28. # 通过遍历 获得id,
  29. for x in info_list:
  30. info_id = x["ID"]
  31. url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"
  32. # 将获取的id值 封装到字典中
  33. new_data = {
  34. "id": info_id
  35. }
  36. # 发送post请求
  37. new_response = requests.post(url=url, data=new_data, headers=headers)
  38. # 得到爬取的数据
  39. dict_json = new_response.json()
  40. # 将爬到的数据【字典】 追加到外面的列表中
  41. all_data_list.append(dict_json)
  42. # 将爬取的数据 追加写入到 文件中
  43. fl = open("国家药品.json", "w", encoding="utf-8")
  44. json.dump(all_data_list, fp=fl, ensure_ascii=False)
  45. fl.close()
  46. print("爬取完毕")