b不同类型的网络爬虫,其实现原理也是不同的,但这些实现原理中,回存在很多共性。
通用网络爬虫
- 获取初始的 URL。初始的 URL 地址可以由用户人为地指定,也可以由用户指定的某个或某几个初始爬取网页决定
- 根据初始的 URL 爬取页面并获得新的 URL。获得初始的 URL 地址后,首先需要爬取对应 URL 地址中的网页,爬取了对应的 URL 地址中的网页后,将网页存储到原始数据库中,并且在爬取网页的同时,发现新的 URL 地址,同时将已爬取的 URL 地址存放到一个 URL 列表中,用于去重及判断爬取的进程。
- 将新的 URL 放到 URL 队列中。在第 2 步中,获取了下一个新的 URL 地址后,会将新的 URL 地址 放到 URL 队列中
- 从 URL 队列中读取新的 URL,并依据新的 URL 爬取网页,同时从新网页中获取新的 URL,并重复上述的爬取过程。
- 满足爬虫系统设置的停止条件时,停止爬取。在编写爬虫的时候,一般会设置相应的停止条件。如果没有设置停止条件,爬虫则会一直爬取下去,一直到无法获取新的 URL 为止。
聚焦网络爬虫
由于其需要有目的地进行爬取,所以必须要增加目标地定义和过滤机制。
- 对爬取目标地定义和描述。
- 获取初始地 URL。
- 根据初始地 URL 爬取页面,并获得新的 URL。
- 从新的 URL 中过滤掉与爬取目标无关地链接。
- 将过滤后地 URL 放到 URL 队列中。
- 从 URL 队列中,根据搜索算法,确定 URL 地优先级,并确定下一步要爬取的 URL 地址。在通用网络爬虫中,下一步爬取哪些 URL 地址,是不太重要的,但在聚焦网络爬虫中,由于其具有目的性,故而下一步爬取哪些 URL 相对来说比较重要,不同的爬取顺序,可能导致爬虫的执行效率不同。
- 从下一步要爬取的 URL 地址中,读取新的 URL,然后依据新的 URL 地址爬取网页,并重复上述爬取过程。
- 满足停止条件时,或无法获取新的 URL 时,停止爬行。
Urllib 库与 URLError 异常处理
要使用 Urllib 爬取网页,首先需要导入对应的模块。
1 | import urllib.request |
使用 urllib.request.urlopen() 打开并爬取一个网页
1 | file = urllib.request.urlopen("http://www.baidu.com") |
此时,还需要将对应的网页读取出来,使用 file.read() 读取全部内容,或者也可以使用 file.readline() 读取一行内容
1 | data = file.read() |
读取内容常见的 3 种方式:
- file.read() 读取文件的全部内容,read 会把读取道德内容赋给一个字符串变量
- file.readlines() 读取文件的全部内容,并把读取到的内容赋给一个列表变量
- File.readline() 读取文件的一行内容
保存到本地
方式一:以写入的方式打开一个本地文件,并将 read 的内容写入该文件中,关闭该文件。
1 | fhandle = open("D:/python/myweb/1.html", "wb") |
方式二:使用 urllib.request.urlretrieve(url, filename=本地文件地址) 函数直接将对应的信息写入本地文件
1 | filename = urllib.request.urlretrieve("http://edu.51cto.com", filename="D:/python/myweb/2.html") |
urlretrieve() 执行过程中,会产生一些缓存,可以使用 urlcleanup() 进行清除
1 | urllib.request.urlcleanup() |
模拟浏览器
超时设置
HTTP 协议请求实战
设置代理服务器
正则表达式
正则表达式时描述字符串排列的一套规则。
基础知识
常见函数
re.match()
re.search()
re.findall()
re.sub()