一、学习路线
你先去做一个通用的网络爬虫,然后做一个主题爬虫、增量式爬虫、多线程并发爬虫,深度优先、广度优先、PR值优先搜索策略,注意反爬虫,要掌握反反爬虫技巧。
先看网络爬虫,然后是自然语言处理,最后才是知识图谱
自己去弄个网络爬虫的程序,跑一下,注意反爬虫和反反爬虫
二、学习资源
视频链接
PPT
知乎
详解4种类型的爬虫技术(聚焦网络爬虫、通用爬虫、增量爬虫、深层网络爬虫) - Kylin何的文章 - 知乎
三、学习笔记
1.爬虫的分类方法
参考资料:
爬虫初步深入-B站
3.Web页面数据获取.ppt
详解4种类型的爬虫技术(聚焦网络爬虫、通用爬虫、增量爬虫、深层网络爬虫) - Kylin何的文章 - 知乎
从爬虫抓取的链接范围看,可以分为基于整个WEB的爬虫和基于局部确定范围的爬虫。
从爬虫抓取的页面内容看,可以分为无固定主题的爬虫和主题爬虫。
从爬虫的执行模式看,可以分为批量型爬虫和增量型爬虫。
从爬虫的内部功能协调方式看,可以单线程爬虫和多线程爬虫。
主题爬虫在通用网络爬虫模型的基础上加入网页分析 、链接分析部分,过滤掉无关网页 ,尽量减少无关页面在本地生成镜像备份,因此在一定程度上减少了资源的消耗 。
爬虫在使用场景中的分类爬虫在使用场景中的分类
-通用爬虫:
抓取系统重要组成部分。抓取的是整张页面数据。
-聚焦爬虫:
是建立在通用爬虫的基础之上。抓取的是页面中特定的局部内容。聚焦爬虫技术增加了链接评价和内容评价模块,其爬行策略实现要点就是评价页面内容以及链接的重要性。
-增量式爬虫:
监测网站中数据更新的情况。只会抓取网站中最新更新出来的数据。
反爬机制
反爬机制门户网站,可以通过制定相应的策略或者技术手段,防止爬虫程序进行网站数据的爬取。
robots.txt协议:君子协议。规定了网站中哪些数据可以被爬虫爬取哪些数据不可以被爬取。
例如:B站的robot协议网址:https://www.bilibili.com/robots.txt
豆瓣的
反反爬策略
爬虫程序可以通过制定相关的策略或者技术手段,破解户网站中具备的反爬机制,从而可以获取门户网站相关数据。
2.搜索引擎原理
爬虫:通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。
爬虫做的事:把抓取到的网页提取好放入数据库中;
四、项目实战
1.教程链接
爬虫项目:爬虫简介-B站视频
http知识补充:前后端交互之 HTTP 协议;请求头(request headers)和响应头(response headers)解析;
http&https协议
2.知识补充
(1)http知识点补充
Request Headers:请求头,帮助服务器决定如何进行响应。
Response Headers:响应头,与请求头类似。比如告知客户端如何控制缓存和cookie。

(2)cookie
(3)User-Agent
请求载体的身份标识,一些门户网站的反爬机制中,会根据是否带有User-Agent来判断是否是爬虫。如果检测到请求的载体身份标识卫某一款浏览器,则判断是用户的正常访问,不会拒绝。否则会判断出是爬虫,会拒绝此次请求。所以做爬虫时候要进行UA伪装。
(4)pycharm正则化一键加引号
教程链接:Pycharm正则化一键加引号
用途:可以给map的键值对快速加引号
步骤:
使用快捷键:Ctrl+R 调出正则匹配工具栏
- 选中需要快速加引号的区域
填写正则匹配表达式,
(.?):(.)’$1’:’$2’,
勾选三个选项
- 替换
(5)xhr、ajax、XML
教程链接:XHR和AJAX终于搞懂了!!
xhr:(XMLHTTPRequest)使用XML格式的HTTP请求
XMLHttpRequest是一个浏览器接口,使得Javascript可以进行HTTP(S)通信。自从浏览器提供有了XMLHTTPRequest这个接口之后,ajax操作就此诞生。
ajax:(Asynchronous JavaScript and XML)异步的JavaScript和XML
在浏览器中捕抓异步数据包

XML:(eXtensible Markup Language)可扩展标记语言
我们在浏览器中使用XMLHTTPRequest对象在服务器之间通信,传输的数据是使用XML的方式,但最终还是会被转换成json数据格式来被我们使用。
(6)浏览器的控制台介绍
教程链接:浏览器实现抓包过程详解
1) NetWork
该选项主要用于抓取网络数据包,比如查看请求信息、响应信息等。它有三个常用选项卡,分别是 All、XHR、JS,其作用如下:
- All:抓取所有的网络数据包
- XHR:抓取所有异步加载的网络数据包
- JS:抓取所有的JS文件
2) Sources
该选项主要用于查看页面的 HTML 、JavaScript 、CSS 的源代码,除此之外,最重要的是它还可以调试 JS 源代码,可以给 JS 代码打断点调试,有助于分析爬虫程序中的一些参数。3) Console
交互模式,能够执行 JavaScript 代码,一般用于对当前程序中 JS 代码进行测试,同时也可以查看 JavaScript 对象,或者调试日志、异常信息等。4) Application
该选项用于查看、修改本地存储(Local Storage)以及会话存储(Session Stroage)等,同时它也可以用来查看 Cookie 信息。
Cookie 是网站服务器为了辨别用户身份,而储存在客户端浏览器上一段加密字符串。某些网站需要用户登录后才可以看到相应的数据。如果想要爬取此类网站的数据,就需要使用 Cookie 模拟用户登录。
(7)fildder抓包工具(电脑+手机)
教程链接:fildder使用教程
(8)句柄
教程链接:句柄详解,什么是句柄?句柄有什么用?
句柄:指向固定地方A,A存对象在内存中的地址。(逻辑上,相当于指针的指针) 区域A:区域A不仅仅存储对象地址,还有别的字段。准确的说句柄指向了一个结构体,其中包括对象地址,还有对象别的属性,比如内存属性、文件属性、内存属性(就是占用了多少内存)、文件属性(就是打开了什么文件),当然可能还有别的属性。
有一个固定的地址(句柄),指向一个固定的位置(区域A),而区域A中的值可以动态地变化,它时刻记录着当前时刻对象在内存中的地址。这样,无论对象的位置在内存中如何变化,只要我们掌握了句柄的值,就可以找到区域A,进而找到该对象。而句柄的值在程序本次运行期间是绝对不变的,我们(即系统)当然可以掌握它。这就是以不变应万变,按图索骥,顺藤摸瓜。
3.需求分析
爬取豆瓣电影Top250的基本信息,包括电影的名称、豆瓣评分、评价数、电影概况、电影链接等。
要爬取的网址:https://movie.douban.com/top250Https://movie.douban.com/top250
新鲜词:百度指数
4.基本流程
5.具体项目代码
(1)项目进行中遇到的错误
问题1:爬取网页时,response.status_code为418
问题解决参考文章:python——爬取网页时response.status_code为418
错误描述:418的意思是被网站的反爬程序检测到,拒绝请求。
解决办法:
UA伪装。当时用了requests库,没有添加请求头等信息,可能被反爬程序识别了,再次请求添加了header的User-Agent信息就可以了。
代码:
headers={‘User-Agent’: ‘你的User-Agent’}
response = requests.get(url=url,headers=headers)
问题2:做百度翻译项目时,出现997错误
问题解决参考文章:爬取百度翻译出现997错误
错误描述:做百度翻译项目时,出现997错误
解决办法:
我自己找的接口,还需要其他的复杂的参数,所以就不用自己找的那个接口,改用接口
这个接口不需要cookies,也不需要很多data,只需要’kw’:’需要翻译的内容’
(2)项目代码
项目1:爬取百度搜索结果页,并将整个页面保存下来
#功能介绍:爬取百度搜索结果页,并将整个页面保存下来
import requests
if name == “main“:
url = “https://www.baidu.com/s“
headers={‘User-Agent’: 你的User-Agent}
wd = input(“我要查:”)
param = {‘wd’:wd}
response = requests.get(url=url,headers=headers,params=param)
if response.status_code == 200:
pageText = response.text
fileName = wd+‘.html’
with open(fileName,‘w’,encoding=‘utf-8’) as fp:
fp.write(pageText)
fp.close()
print(‘保存成功’)
项目2:模拟百度翻译,获取翻译结果
功能介绍 :模拟百度翻译,获取翻译结果。
原理:在输入要翻译内容时,页面使用ajax进行异步刷新,ajax就是一个网页请求。
ajax文件获取方式:
确认是哪个ajax文件的方式:
一个个点开看,在header中看请求网页、请求方式、请求参数,再去response中看看返回的内容,然后就能确认了。



代码:
import requests
import json
if name == ‘main‘:
#设置访问路径和请求参数
_url = ‘https://fanyi.baidu.com/sug‘
headers={‘User-Agent’:你的User-Agent }
kw = input(“我要翻译:”)
data = {
‘kw’:kw
}
#发起请求,并获得响应结果
response = requests.post(url=url,headers=headers,data=data)
if response.status_code == 200:
dicObj = response.json()
print(dicObj)
#存储获取到的资源
fileName = kw+‘-translation.json’
with open(fileName,‘w’,encoding=‘utf-8’) as fp:
json.dump(dicObj,fp,ensure_ascii=False) #结果中有中文,不能用ASCII码
_print(“succeed”)
项目3:获取药监局中一众化妆品许可证列表的详细信息
功能介绍 :获取药监局中一众化妆品许可证列表的详细信息。
原理:化妆品许可证列表和许可证详情,都是异步获取的,所以要分析两次异步请求的接口和参数。
化妆品许可证列表:
化妆品详情页:
分析:
获取化妆品许可证列表(有用数据分析):
general:
- Request URL: http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList
- Request Method: POST
请求参数:
- on: true
- page: 1
- pageSize: 15
- productName:
- conditionType: 1
- applyname:
响应:(截取了1条记录)
{ “filesize”: “”, “keyword”: “”, “list”: [{ “ID”: “7e8f130cd84a4728a1acf82ad622a005”, “EPSNAME”: “广州德信药业科技有限公司”, “PRODUCT_SN”: “粤妆20210172”, “CITY_CODE”: null, “XK_COMPLETE_DATE”: { “date”: 24, “day”: 4, “hours”: 0, “minutes”: 0, “month”: 5, “nanos”: 0, “seconds”: 0, “time”: 1624464000000, “timezoneOffset”: -480, “year”: 121 }, “XK_DATE”: “2026-06-23”, “QF_MANAGER_NAME”: “广东省药品监督管理局”, “BUSINESS_LICENSE_NUMBER”: “914401013211104039”, “XC_DATE”: “2021-06-24”, “NUM“: 1 }], “orderBy”: “createDate”, “orderType”: “desc”, “pageCount”: 378, “pageNumber”: 1, “pageSize”: 15, “property”: “”, “totalCount”: 5658 }
获取化妆品许可证详情(有用数据分析):
general:
- Request URL: http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
- Request Method: POST
请求参数:
- id: 7e8f130cd84a4728a1acf82ad622a005
响应:
{ “businessLicenseNumber”: “914401013211104039”, “businessPerson”: “周小婷”, “certStr”: “一般液态单元(护发清洁类、护肤水类、啫喱类);膏霜乳液单元(护肤清洁类、护发类)”, “cityCode”: “”, “countyCode”: “”, “creatUser”: “”, “createTime”: “”, “endTime”: “”, “epsAddress”: “广东省广州市白云区白云湖街夏茅松园路8号3楼301房”, “epsName”: “广州德信药业科技有限公司”, “epsProductAddress”: “广州市白云区白云湖街夏茅松园路8号3楼301房”, “id”: “”, “isimport”: “Y”, “legalPerson”: “周小婷”, “offDate”: “”, “offReason”: “”, “parentid”: “”, “preid”: “”, “processid”: “”, “productSn”: “粤妆20210172”, “provinceCode”: “”, “qfDate”: “”, “qfManagerName”: “广东省药品监督管理局”, “qualityPerson”: “贺波”, “rcManagerDepartName”: “白云区白云湖市场监督管理所”, “rcManagerUser”: “/“, “startTime”: “”, “warehouseAddress”: “”, “xkCompleteDate”: null, “xkDate”: “2026-06-23”, “xkDateStr”: “2021-06-24”, “xkName”: “苏盛锋”, “xkProject”: “”, “xkRemark”: “无”, “xkType”: “201” }
代码:
import requests #制定URL,获取网页数据
import json
if name == “main“:
url = “http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList“;
#UA伪装
_headers={‘User-Agent’: 你的user-agent}
idsList = [] #放id列表
detailList = [] #放详情的列表
for page in range(1,6):
data = {
‘on’:‘ true’,
‘page’:page,
‘pageSize’:‘15’,
‘productName’:‘’,
‘conditionType’:‘1’,
‘applyname’:‘’
}
try:
jsonIds = requests.post(url=url,headers=headers,data=data).json()
for dic in jsonIds[‘list’]:
idsList.append( dic[‘ID’])
# print(idsList) #输出测试
# print(detailList)
_except requests.exceptions.ConnectTimeout:
print( ‘超时!’)
except requests.exceptions.ConnectionError:
print(‘无效地址!’)
print(**'idsListNum = '**,str(len(idsList)))**for **id **in **idsList:<br /> detailUrl = **'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'<br /> **data={<br /> **'id'**:id<br /> }<br /> detailJson = requests.post(url=detailUrl,headers=headers,data=data).json()<br /> detailList.append(detailJson)print(**'detailsNum = '**,str(len(detailList)))<br /> _# html=response.text<br /> # html = BeautifulSoup(html, 'lxml')<br /> # print('all ids:',idsList) #输出测试<br /> _**with **open(**'药监总局化妆品详情列表Demo.html'**,**'w'**,encoding=**'utf-8'**) **as **fp:<br /> json.dump(obj=detailList,fp=fp,ensure_ascii=**False**)<br /> print(**'爬取结束'**)
豆瓣的

句柄:指向固定地方A,A存对象在内存中的地址。(逻辑上,相当于指针的指针)
区域A:区域A不仅仅存储对象地址,还有别的字段。准确的说句柄指向了一个结构体,其中包括对象地址,还有对象别的属性,比如内存属性、文件属性、内存属性(就是占用了多少内存)、文件属性(就是打开了什么文件),当然可能还有别的属性。
