文章目录

  • 前言
  • 一、爬虫是什么?
    • 1.1 robots.txt
    • 1.2 http
    • 1.3 https
  • 二、request模块
    • 2.1 网络请求requests
    • 2.2 实战巩固⭐
      • 2.1 ruquests第一血
      • 2.2 简易网页采集器
      • 2.3 破解百度翻译
      • 2.4 爬取豆瓣带你应分类排行榜中电影详情数据 ⭐
      • 2.5 爬取肯德基餐厅查询中指定地点的餐厅数据
      • 2.6 爬取国家药品监督总局中基于中华人民共和国化妆品生产许可证相关数据⭐⭐⭐
  • 总结

前言

  1. 你是否在夜深人静的时候,想看一些会让你更睡不着的图片却苦于没有资源…
  2. 你是否在节假日出行高峰的时候,想快速抢购火车票成功…
  3. 你是否在网上购物的时候,想快速且精准的定位到口碑质量最好的商品…

本章节所有感悟来自:Python爬虫7天速成(2020全新合集)无私分享 Python
视频是2020年,我是2021年看得视频,网站的更新速度较快,其中2.6章节中的药品监督总局网址已经不是视频中的网址我已经做个笔记和更改,希望帮助到想学习爬虫的你们


一、爬虫是什么?

  • 通过编写程序、模拟浏览器上网,然后让其模拟浏览器去上网,然后让其去互联网上抓取数据的过程。
  • 可以认为浏览器上网就是一个原始的、天然的爬虫工具。

爬虫的两种方式

  • 浏览器
  • 编写代码
  • 爬虫的价值
  • 爬虫究竟是合法的还是违法的?
  1. 在法律中是不被禁止的
  2. 具有违法风险
  3. 善意爬虫 恶意爬虫
  • 爬虫带来的风险可以体现再如下两个方面:
  1. 爬虫干扰了别访问网站的正常运营
  2. 爬虫抓取了受到法律保护的特定类型的数据或信息
  • 如何在使用编写爬虫的过程中避免进入‘橘子’的厄运呢?
  1. 时常的优化自己的程序,避免干扰被访问网站的正常运行
  2. 在使用,传播爬取到二到数据时,审查抓取到的内容,如果发现了涉及到用户隐私或者商业机密等敏感内容,需要及时停止爬取或传播
  • 爬虫在使用场景中的分类
  • 通用爬虫
    抓取系统重要组成部分。抓取的是一整张页面数据
  • 聚焦爬虫
    是建立在通用爬虫的基础之上。抓取的是页面中特定的局部内容。
  • 增量式爬虫
    检测网站中数据更新的情况。只会抓取网站中最新更新出来的数据。
  • 爬虫的矛与盾
  • 反爬机制
    相关的门户网站,可以指定相应的策略或者技术手段,防止爬虫程序进行网站数据的爬取。
  • 反反爬策略
    爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而可以获取门户网站中相关的数据。

1.1 robots.txt

  • robots.txt协议

其实就是一项君子协议
此协议就规定了网站哪些数据可以被爬虫爬取,哪些数据不可以被爬虫爬取。
既可以保护网站隐私数据,又可以被搜索引擎收录,增加相关网站的流量。

  • robots.txt协议展示

1.2 http

超文本传输协议

  • http协议

概念:就是服务器客户端进行数据交互的一种形式。

  • 常用请求头信息
  • User-Agent:请求载体的身份标识
    例如:1. 使用Google浏览器浏览一个网址,则Google浏览器的身份就是当前载体的身份标识,这个身份标识即可以使用一个字符串来表示。2. 若是使用编写代码方式发起一个url的请求则标识就不是上述字符串
  • Connection:请求完毕之后,是断开连接还是保持连接
  1. close
  2. keep live
  • 常用响应头信息
  • Content-Type:服务器响应回客户端的数据类型
    可以是字符串、Json等

1.3 https

http是安全的,https是不安全的额
安全的超文本传输协议,数据传输和交互的时候是经过加密的

  • 加密方式
  1. 对称密钥加密

客户端需要把发送给服务器的数据进行加密(加密方式是由客户端自己指定的),然后传输密文和解密的密钥给服务器,服务器接收后可以根据密钥对密文进行解密,解密之后,服务器就可拿到原始数据
分析:若密文和密钥被拦截,则密文就会被密钥解密,数据就会被暴露。

  1. 非对称密钥加密

  1. 证书密钥加密

https所采用的密钥加密就是该方式


二、request模块

2.1 网络请求requests

  • urllib模块 (古老的模块)
  • request模块⭐(重点学习)

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

  • 如何使用?(reqests模块的编码流程)⭐

一定要严格遵从浏览器发送请求流程:

  1. 指定url(具体网址)
  2. 发起请求(类似浏览器地址栏输入网址按下回车–GET请求)
  3. 获取相应数据(回车之后,浏览器会有一页数据)
  4. 持久化存储–响应数据(request模块在互联网上爬取的页面数据)
  • 安装

pip install requests

2.2 实战巩固⭐

2.1 ruquests第一血

  • 爬取搜狗首页的页面数据
import  requests if __name__ == "__main__":# 1. 指定urlurl = "https://www.sogo.com/"# 2. 发起请求  response = requests.get(url=url) # get方法灰返回一个响应对象# 3. 获取相应数据 .text返回的是字符串形式的响应数据page_text = response.textprint(page_text)# 4. 持久化存储 --page_textwith open('./sogo.html', 'w',encoding='utf-8') as fp:fp.write(page_text)print('爬取数据结束')

2.2 简易网页采集器

爬取搜狗指定词条对应的都多结果页面

# 反爬机制:UA检测
# UA检测对应的反反爬策略:#UA伪装# UA:User-Agent(请求载体的身份标识)
'''
UA检测:门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份标识是某一款浏览器,那么就说明该请求是一个正常的请求。但是,如果检测到请求的载体身份标识不是基于某一款浏览器的,则表示该请求为不正常的请求(爬虫),z则服务器端就很有可能拒绝该次请求
'''#UA伪装:让爬虫对应的请求载体身份标识伪装成一款浏览器
import requestsif __name__ == '__main__':#UA伪装:将对应的User-Agent封装到一个字典中# 伪装成Google浏览器headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'}# 1. 指定urlurl = 'https://www.sogou.com/sogou?'# 'https://www.sogou.com/sogou?query=波晓张'这样也可以的 # 处理url携带的参数  通常情况url不可能只携带一组参数# 处理:封装到字典中key = input('enter a word:')param = {'query':key}# 2. 对指定的url发起请求 对应的url是携带参数的,并且请求过程中处理了参数response = requests.get(url,params=param,headers=headers)# 3. 获取响应数据page_txt = response.textfilename = key+'.html'with open(filename,'w',encoding='utf-8') as fp:fp.write(page_txt)print(filename,'保存成功!!!')

  • 出现问题

    1. 解决乱码问题

处理乱码后,页面显示【异常访问请求】导致请求数据的缺失

  • 异常访问的请求
    • 网站后台已经检测出该次请求不是通过浏览器发起的请求而是通过爬虫程序发起的请求(不是浏览器发起的请求都是异常请求

2.3 破解百度翻译

  1. 前期分析

录入单词之后,没有触碰任何的点击事件。当前页面就变化了,也就是进行了局部刷新(AJAX请求

  • 下图是录入数据前后对比:

  • 什么是 AJAX ?
  1. 结论

通过浏览器抓包(F12)了解到:

  • 对应请求为POST请求(携带了参数)
  • 响应数据是一组json数据
  1. 代码
import requests
import jsonif __name__ == '__main__':# 1. 指定url# post请求post_url = 'https://fanyi.baidu.com/sug'# 2. 进行UA伪装headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
}# 3. post请求参数处理(同get)word = input('enter a word:')data = {'kw':word}# 4. 请求发送respose = requests.post(url=post_url,data=data,headers=headers)# 5. 获取响应数据 由浏览器抓包工具可知返回的是json数据# 此处若用respose.text  则返回的是字符串# print("text",respose.text)dic_obj = respose.json()# json()方法返回的是obj(如果确认响应数据是json类型,才可以使用json())# print("dic_obj",dic_obj)# 6. 持久化存储filename = word+'.json'fp = open(filename,'w',encoding='utf-8')json.dump(dic_obj,fp=fp,ensure_ascii=False) ①# 拿到的json字符串是不能用ASCII进行编码的print('over!!!')


2.4 爬取豆瓣带你应分类排行榜中电影详情数据 ⭐

  1. 前期分析
  • 局部搜索



  • 全局搜索



如上图搜索并点击进入相应内容,进入相应页面后可以点击类型:喜剧,之后通过滑动滚轮后发现滑动到底部后发现:

  1. 地址栏没有发生变化
  2. 右边的矩形灰色栏一到底部,底部就会出现新的电影数据而且矩形灰色栏回跳动到中间位置

因此,我们判断滚轮滑动到底部,页面进行了AJAX请求

思考:基于抓包工具进行全局搜索不一定可以每次都能定位到动态加载数据对应的数据包?
原因:如果动态加载的数据是经过加密的密文数据

  1. 代码
import requests
import jsonif __name__ == '__main__':url = 'https://movie.douban.com/j/chart/top_list'param = {'type': '24','interval_id': '100:90',' action': '','start': '0', # 从库中第几部电影去取'limit': '20', # 第一次取出的个数}headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
}# 根据浏览器抓包工具进行请求类型判断response = requests.get(url=url,params = param,headers = headers)# 由浏览器判断返回类型是列表 list_data = response.json()①fp = open('./douban.json','w',encoding='utf8')json.dump(list_data,fp,ensure_ascii=False)print('over!!!')


2.5 爬取肯德基餐厅查询中指定地点的餐厅数据

肯德基官网

    1. 前期分析

同理,进入地址搜索栏后,输入地址若地址栏没有发生变化则页面是进行的AJAX请求,反之则不是AJAX请求


结论:该页面发生了AJAX请求

  1. 抓包 ⭐


  2. 代码

  • 爬取一页数据的代码
import requestsif __name__ == '__main__':# 爬取的是第一页数据url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'data = {'cname': '','pid': '','keyword': '北京','pageIndex': str(page),# 这里最好是字符串形式'pageSize': '10',}headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
}respose = requests.post(url=url,data=data,headers=headers)page_text = respose.json()# 打印餐厅信息 - 名字 地址for dic in page_text['Table1']:title = dic['storeName']addr = dic['addressDetail']print(title,addr)# 这只是第一页数据,如何拿到第二页、第三页数据........?
  • 爬取多页数据的代码
import requestsif __name__ == '__main__':# 爬取多页url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'# 拿到北京八页数据for page in range(1,9):data = {'cname': '','pid': '','keyword': '北京','pageIndex': str(page),# 这里最好是字符串形式'pageSize': '10',}headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'}respose = requests.post(url=url,data=data,headers=headers)page_text = respose.json()# 打印餐厅信息 - 名字 地址for dic in page_text['Table1']:title = dic['storeName']addr = dic['addressDetail']print(title,addr)

2.6 爬取国家药品监督总局中基于中华人民共和国化妆品生产许可证相关数据⭐⭐⭐

化妆品生产许可信息管理系统服务平台 - NMPA

  1. 前期分析
  • 代码测试验证

用如下代码发起请求:

import  requestsif __name__ == "__main__":url = ' http://scxk.nmpa.gov.cn:81/xk/'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'}page_text = requests.get(url=url, headers=headers).textwith open('./huazhuangpin.html','w',encoding='utf8') as fp:fp.write(page_text)

结论:页面中的数据一定不是http://scxk.nmpa.gov.cn:81/xk/这个url请求到的,是别的请求方式请求到的

  • (很有可能是AJAX请求)
  • 抓包工具请求验证



利用在线JSON解析工具发现:

  • 首页对应的企业信息数据是通过ajax请求得到的

如下图,通过点击首页的公司发现

  • url的域名都是一样的,只有携带的参数(id)不一样
  • id值可以从首页对应的ajax请求到的json串中获取
  • 域名和id值拼接出一个完整的企业对应的详情页的url


<-------------------------------------------手动分割----------------------------------------------->

那上图获得的公司对应的化妆品生产许可证信息页面数据也是AJAX请求到的吗?
我们需要做相关验证:

  • 代码验证(笨方法)
  • 抓包工具验证
  • 抓包工具验证

结论:我们不可能是通过对公司的化妆品生产许可证信息页面数据的url发请求获得数据的(看图)

  • 详情页数据信息也是动态加载出来的
  • 分析详细数据的由来



json解析如下 :与详情页数据一致

{"businessLicenseNumber": "91320213355032183D","businessPerson": "邱国忠","certStr": "一般液态单元(护肤水类);膏霜乳液单元(护肤清洁类)","cityCode": "","countyCode": "","creatUser": "","createTime": "","endTime": "","epsAddress": "无锡市北塘区金山四支路11-1-12号","epsName": "无锡邦士立生物科技有限公司","epsProductAddress": "无锡市北塘区金山四支路11-1-12号","id": "","isimport": "N","legalPerson": "邱国忠","offDate": "","offReason": "","parentid": "","preid": "","processid": "202102240853582029gbgi","productSn": "苏妆20160013","provinceCode": "","qfDate": "","qfManagerName": "江苏省药品监督管理局","qualityPerson": "宗同祥","rcManagerDepartName": "江苏省药品监督管理局(无锡检查分局)","rcManagerUser": "王丹、冯佳超","startTime": "","warehouseAddress": "","xkCompleteDate": null,"xkDate": "2026-04-20","xkDateStr": "2021-04-20","xkName": "张贤","xkProject": "","xkRemark": "","xkType": "202"
}

对不同的公司进行上述操作发现:

  • 所有的post请求的url都是一样的,只有参数id值是不同的。
  • 如果我们可以批量获取多家企业的id后,就可以将id和url形成一个完整的详情页对应详情数据的ajax请求的url
  1. 代码
  • 爬取第一页详情数据并存储
import  requests
import jsonif __name__ == "__main__":# 批量获取企业id值url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'# 参数的封装data = {'on': 'true','page': '1',# 页码'pageSize': '15',# 每页显示的数据'productName': '','conditionType': '1','applyname': '','applysn':'',}headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'}id_list = [] # 存储企业的idall_data_list = [] # 存储所有企业的详情数据# 字典类型json_ids = requests.post(url=url, headers=headers,data=data).json()for dic in json_ids['list']:id_list.append(dic['ID'])# print(len(id_list))   # 15# 获取企业详情数据post_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'for id in id_list:data_id ={'id':id}# 发起请求detail_json = requests.post(url=post_url, data=data_id,headers=headers).json()# print(detail_json,'---------------ending------------')# 存储到列表all_data_list.append(detail_json)# 持久化存储fp = open('./allCompanyData.json','w',encoding='utf-8')json.dump(all_data_list,fp,ensure_ascii=False)print('over!!!')
  • 爬取前五页详情数据并存储
import  requests
import jsonif __name__ == "__main__":# 批量获取企业id值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) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'}id_list = [] # 存储企业的idall_data_list = [] # 存储所有企业的详情数据for page in range(1,6):# 参数的封装data = {'on': 'true','page': str(page),# 页码'pageSize': '15',# 每页显示的数据'productName': '','conditionType': '1','applyname': '','applysn':'',}# 字典类型json_ids = requests.post(url=url, headers=headers,data=data).json()for dic in json_ids['list']:id_list.append(dic['ID'])# print(len(id_list))   # 15# 获取企业详情数据post_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'for id in id_list:data_id ={'id':id}# 发起请求detail_json = requests.post(url=post_url, data=data_id,headers=headers).json()# print(detail_json,'---------------ending------------')# 存储到列表all_data_list.append(detail_json)print(len(all_data_list))# 持久化存储fp = open('./allCompanyData.json','w',encoding='utf-8')json.dump(all_data_list,fp,ensure_ascii=False)print('over!!!')

总结

①json.dump()

  • Python json.dump()用法及代码示例

  • json在线格式化工具


    ②requests.post():

交换参数不影响函数的使用

下节内容:数据解析

  • 聚焦爬虫
  • 正则
  • bs4
  • xpath

爬虫入门概念与硬核实战巩固(一)相关推荐

  1. Rasa 3.X 智能对话机器人案例开发硬核实战高手之路 (7大项目Expert版本)

    课程标题:Rasa 3.X 智能对话机器人案例开发硬核实战高手之路(7大项目Expert版本) 课程关键字:Rasa Application.Debugging.E-commerce.Retail.C ...

  2. 【NAS备份】摆脱丢数据的噩梦,群晖备份硬核实战教程分享

    前言 大家好,我是村雨Mura,本期来聊一聊我是如何用 NAS 轻松.完整地备份自己数据的. 首先,硬件再好不如备份 即便从小的线材到硬盘的质量都用最好的,也很难保证不丢数据,宇宙射线.硬盘不可逆衰减 ...

  3. Python爬虫入门(四):实战,爬取4399小游戏首页

    目录 robots.txt robots协议 robots.txt 语法 君子协定 何时需要robots协议? 查看4399.com的robots.txt 设定并分析目标 代码 urllib2& ...

  4. 三维球体换算到二维_AutoCAD三维入门,这些硬核干货要知道,看不懂建议备份收藏...

    一直分享的都是AutoCAD绘图的平面绘图教程以及技巧,今天我们换一个话题: 三维画图入门 你有哪些想法?留言区可以评论. 楼主先来说一说,其实和二维差别不是很多,首先还是要熟悉各种的工具功能的使用, ...

  5. Mysql入门宝典【硬核前方高能,佬有所学】

    目录 什么是数据库 1.2 主流数据库 基本使用 服务器,数据库,表关系 基础使用 数据逻辑存储 MySQL架构 SQL分类 存储引擎 库的操作 字符集和校验规则 校验规则对数据库的影响(大小写) 操 ...

  6. autocad不能画图_AutoCAD三维入门,这些硬核干货要知道,看不懂建议备份收藏

    一直分享的都是AutoCAD绘图的平面绘图教程以及技巧,今天我们换一个话题: 三维画图入门 你有哪些想法?留言区可以评论. 楼主先来说一说,其实和二维差别不是很多,首先还是要熟悉各种的工具功能的使用, ...

  7. 爬虫入门学习(八)模拟登录丁香园论坛爬取用户信息

    爬虫入门学习(八)实战大项目模拟登录丁香园爬取信息 1 目标 2 思路 3 主要的技术点 3.1 模拟登录 3.2 抓取用户个人主页 4 完整代码 5 项目后期拓展 1 目标 模拟登录丁香园,并抓取页 ...

  8. 我们跟30家PoS团队聊了聊,Staking最硬核的干货都在这儿了

    到目前为止,全球排名前 30 的数字加密货币中,已经有 13 个项目正在使用 PoS机制.整个 Staking 市场将在 2020 年达到 540 亿美元,约占整个数字加密货币市场的 16.2%.种种 ...

  9. 超硬核Java学习路线图+学习资源+实战项目汇总,看完以后不用再问我怎么学Java了!

    之前写过很多次关于Java学习指南.Java技术路线图的文章.但是总还是有小伙伴来问我,Java怎么学,项目怎么做,资源怎么找,真是让人头秃. 于是这次黄小斜决定来一波狠的,把所有这些内容都整理起来, ...

最新文章

  1. react native 组件之switch组件的用法
  2. r语言工作路径linux,R语言实用基础知识_工作路径-注释-安装和卸载R包_2019-12-01...
  3. pandas read_csv 出现中文乱码
  4. 什么是响应式布局设计
  5. 因 inode 不足导致数据库登陆报错相关问题
  6. C# winform post 请求指定 url
  7. 【问题】ajax两种传递id值方式的区别
  8. MySQL 5.5/5.6——概述 MySQL 客户端程序
  9. MATLAB通信仿真实例1:无噪声信道下DSB-SC调制解调器
  10. Java docx4j 操作word 1.0
  11. 【AR】DroidCam笔记本调用手机摄像头(smartphone's camera as pc webcam)
  12. DSP2812 RAM不够用的解决方法【转载】
  13. PHP与西门子PLC,西门子PLC“与”指令
  14. dart语言(dart语言菜鸟教程)
  15. 从美术生到程序员转型之路【我的故事】
  16. 什么是python 包_什么是python包
  17. 【自然语言处理】ELMo 讲解
  18. 【NP问题】P问题,NP问题,NPC问题,NPH问题
  19. 九阴真经服务器维护,《九阴真经》-官方网站-一亿人的真武侠梦,开创全自由空中打斗...
  20. 第五届蓝桥杯真题解析【JavaC组】

热门文章

  1. turn.js 翻书效果
  2. vue+axios+el-upload实现文件上传(带参数):
  3. 【统计学】贝叶斯推理方法
  4. Docker入门级别笔记
  5. mysql口径制定_面试准备_mysql
  6. JavaWeb-Servlet源码分析
  7. 算法分析c语言大整数乘法,大整数乘法浅析(C语言实现)
  8. Linux网络配置nmtui激活网卡失败
  9. redux|react
  10. 揭秘微信营销—“美女”微信聊天骗局-吴雪峰-专题视频课程