【python学习笔记】7:用python实现爬虫-基础

时间:2021-07-20 06:33:34

爬虫:一段自动抓取互联网信息的程序。

设定一个需求,我们制作爬虫来自动从互联网上获取所需的信息。爬虫可以从一个URL出发,访问它所关联的所有能访问的URL,并从每个页面上提取出我们需要的价值数据。爬虫就是自动访问互联网并提取数据的程序。

爬虫的价值:互联网数据为我所用。

简单的爬虫架构

①爬虫调度端:启动爬虫、停止爬虫或者监视爬虫的运行情况。

②URL管理器:对将要爬取的URL和已经爬取的URL管理。

③网页下载器:从URL中选取将要爬取的URL并给网页下载器。下载器会将URL指定的网页下载下来存储成一个字符串。

④网页解析器:网页下载器生成的字符串将传送给网页解析器,进行解析。一方面可以得到一些我们要的价值数据,另一方面这个网页所指向的其它URL可以补充进网页下载器。

以上三个器形成的循环,只要还有URL就会一直进行下去。

【python学习笔记】7:用python实现爬虫-基础

动态运行流程

【python学习笔记】7:用python实现爬虫-基础

可以看到爬虫调度端是做这些工作的核心(但不属于爬虫,上面的②③④在一起才是爬虫)。最后的输出价值数据也是靠爬虫调度端来调用应用的方法来输出。

URL管理器

可以有效防止重复抓取或循环抓取。URL管理器要至少实现以下几个功能:①添加新的URL到待爬取的集合中,在添加时要判断待添加的URL是不是已经在容器中了。②从容器中获取一个待爬取的URL,获取前要对容器判空。③在URL被爬取之后,将其从待爬取集合移动到已爬取集合。

URL管理器目前有三种实现方式:

①将待爬取的URL集合和已爬取的URL集合放入内存中。就只要将两种URL分别放在两个set中,可以自动清除集合中重复的元素。

②将URL存储在关系数据库中,如MySQL的urls(url, is_crawled)。

③将URL存储在缓存数据库中,如redis的set,大型互联网公司一般都采用缓存数据库。

网页下载器

将互联网上的URL对应的网页下载到本地的工具,它是爬虫的核心组件。除了存储成内存字符串之外,还可以存储成本地文件。

Python的几种网页下载器:

urllib2:是python的一个官方的基础模块,支持直接的URL下载,或者向网页提交一些需要用户输入的数据,甚至支持需要登录网页的cookie处理,需要代理访问的代理处理等增强功能。

requests:是python的一个第三方插件,功能更强大。

urllib2(在py3中并成urllib库)的使用

注意:

python 3.x中urllib库和urilib2库合并成了urllib库

import时常常要import urllib.request

其中urllib2.urlopen()变成了urllib.request.urlopen()

urllib2.Request()变成了urllib.request.Request()

①将url传送给urllib2.urlopen(url),代码如下:

import urllib.request
#直接请求
response=urllib.request.urlopen('http://www.baidu.com')
#获取状态码,如果是200表示获取成功
print (response.getcode())
#读取内容
cont=response.read()

②将参数url,data,header传送给urllib的request类,生成一个Request对象,然后仍然使用urlopen()方法,以request作为参数发送网页请求。代码如下:

import urllib.request
#创建Request对象
request=urllib.request.Request('http://www.baidu.com')
#添加数据
#注意下面这行是错的,没有找到py3中的方法,还是按py2来写的
request.add_data("a","1")#这里是提交a这个数据项,它的值为1
#添加http的header
request.add_header('User-Agent','Mozilla/5.0')#这里是将爬虫伪装成Mozilla浏览器
#发送请求获取结果
response=urllib.request.urlopen(request)

③添加特殊情景的处理器:

需要用户登录才能访问的网页要使用HTTPCookieProcessor,需要代理才能访问的网页需要使用ProxyHandler,使用了HTTPS加密访问的网页需要使用HTTPSHandler,具有URL自动跳转关系的网页需要使用HTTPRedirectHandler。将这些Handler传送给urllib的build_opener方法来创建opener对象,然后用这个opener对象给urllib的install_opener,这样urllib这个模块就具有了对这些场景处理的能力。然后在用urlopen()方法来实现。

示例代码:

#py2中的cookielib都在py3的http.cookiejar中了
import urllib.request,http.cookiejar
#创建cookie容器
cj=http.cookiejar.CookieJar()
#创建一个opener
opener=urllib.request.build_opener()
#给urllib安装opener
urllib.request.install_opener(opener)
#使用带有cookie的urllib访问网页
response=urllib.request.urlopen("http://www.baidu.com")

这三种方法都实现了网页的下载,但是每一种方法都比前一种方法有更大的更强的处理能力。

学了爬虫才发现py2和py3名称和库有好大差别,网上用py3写爬虫的资料好少啊。