python爬虫基础

爬虫
爬虫,全称网络爬虫,指按照一定的规则(模拟浏览器人工登录网页的方式),自动抓取网络信息数据的程序。简单的说,就是将浏览器上网所能看到页面上的内容通过爬虫程序自动获取下来,并进行存储。

爬虫其实就是一个程序自动收集获取指定网络数据信息的过程,网络数据信息量十分庞大,人工获取无法完成,这时就需要爬虫来完成了。另外做数据挖掘、数据分析也是需要大量的数据做实验基础,爬虫就能很好的获得数据。

理论上来讲,浏览器能获取到的信息,爬虫程序都能获取到。
1.    爬虫的分类
网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。实际的网络爬虫系统通常是几种爬虫技术相结合实现的。

(1)    通用网络爬虫
通用网络爬虫的爬行范围从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据,搜索引擎如百度、谷歌都属于这一类。

(2)    聚焦网络爬虫
聚焦网络爬虫,是指选择性地爬行那些与预先指定了规则网页或者数据信息的网络爬虫。 这类爬虫指定了待爬取的URL的范围或者过滤规则,只获取预期的数据信息,相对更具有针对性,更新更快。

(3)    增量式网络爬虫
增量式网络爬虫是 指 对 已 下 载 网 页 采 取 增 量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。这类爬虫只下载跟新发生变化的页面,减少了时间和空间耗费,但是增加了爬虫的算法复杂度和实现难度。

(4)    深层网络爬虫
Web 页面按存在方式可以分为表层网页和深层网页。 表层网页是指传统搜索引擎可以索引的以超链接可以到达的静态网页为主构成的 Web 页面。深层网络是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。例如那些用户注册后才可见的网页就属于深层网络。
2.    爬虫的搜索策略
网页的抓取策略可以分为深度优先、广度优先和最佳优先三种。目前常见的是广度优先和最佳优先方法。

(1)    广度优先搜索
广度优先搜索策略是指在抓取过程中,在完成当前层次的搜索后,才进行下一层次的搜索。该算法的设计和实现相对简单。在目前为覆盖尽可能多的网页,一般使用广度优先搜索方法。

(2)    最佳优先搜索
最佳优先搜索策略按照一定的网页分析算法,预测候选URL与目标网页的相似度,或与主题的相关性,并选取评价最好的一个或几个URL进行抓取。它只访问经过网页分析算法预测为“有用”的网页。

(3)    深度优先搜索
深度优先搜索策略从起始网页开始,选择一个URL进入,分析这个网页中的URL,选择一个再进入。如此一个链接,一个链接地抓取下去,直到处理完一条路线之后再处理下一条路线。
3.    Scrapy
Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。
Scrapy默认使用LIFO队列,搜索策略是深度优先,要以广度优先顺序进行爬取,可以设置以下的设定:
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'
(1)    Spider
Spider是scrapy中最简单基础的spider。Spider并没有提供什么特殊的功能。 其仅仅请求给定的 start_urls ,并根据返回的结果调用spider的 parse 方法。
(2)    CrawlSpider
CrawlSpide是scrapy中Spider的派生类,Spider的设计原则是只爬取start_url列表中的网页,而从爬取的网页中获取超链接并继续爬取的工作CrawlSpider类更适合。
CrawlSpide与Spider类的最大不同是多了一个rules参数,其作用是定义提取动作。指定allow_domains允许域范围和start_url列表,程序以start_url开始下载网页内容并根据rules过滤提取网页中的超链接继续爬取,在rules中包含一个或多个Rule对象,Rule对象的常用参数有(link_extractor, callback, follow)。
1)    Link Extractor定义了从爬取到的页面提取链接的规则,常用参数:
allow(正则表达式(或多个正则的列表))urls必须匹配才能提取。如果没有给出(或为空),将匹配所有链接。
deny(与allow格式相同)urls必须匹配才能排除,优先于allow参数。如果没有给出(或为空),将不会排除任何链接。
restrict_xpaths(str或list,是一个XPath或XPath的列表),它定义响应中应从中提取链接的区域。如果给出,只有那些XPath选择的文本将被扫描链接。
2)    callback,String类型,指定提取到的链接所要执行的回调函数。
3)    follow类型是布尔,指定提取到的链接是否需要重新加入待爬取队列默认是True,需要加入待爬取队列,如果指定了callback,则默认是False不加入待爬取队列而是调用指定的函数。
4.    爬虫的工作流程
以Scrapy的CrawlSpider为例,简介爬虫流程
(1)    首先指定爬虫的起始URL列表和允许域范围;
(2)    将这些URL放入待抓取URL队列;
(3)    从待抓取URL队列中取出待抓取URL,发起请求,并将URL对应的网页下载下来,存储进已下载网页库中,将此URL加入已下载URL队列(去重)
(4)    接上一步,解析网页中包含的所有链接,符合要求且不在已下载队列中的链接加入待抓取队列。
(5)    持续循环执行(3)(4)步骤,直到待抓取URL队列为空。
5.    知识点总结
(1)    URL去重
使用Redis的set(集合)类型存储爬取过的URL,由于集合成员是唯一的,这就意味着集合中不能出现重复的数据。但是随着数据量的增大,容易出现内存溢出,这时候可以进行压缩处理。带有?和&的URL是携带参数的URL,一般情况下,多个参数的顺序不同但响应结果是一样的,这类URL应该被识别为重复的URL,然后使用加密算法如MD5加密URL再存入Redis,加密后将会大幅压缩URL占用的内存。
(2)    异步下载
网页下载是一个耗时操作,这时自然需要用到异步,Scrapy是基于twisted这个异步模型的。当然也可以自定义使用多线程或者协程来完成。
(3)    存储
爬虫的数据即使经过清洗,也不可避免的存在部分字段缺失之类的问题,加上爬虫数据不存在非常紧密的关系,所以比起MySQL采用MongoDB较为合适。
(4)    模拟登录
采用requests模块可以建立session,以session的方式模拟登录,登录成功后保存cookie,下次启动爬虫时,优先使用cookie。
对于携带难以破解的JS加密参数或者post登录不是简单POST而是JS触发的登录,可以采取PhantomJS+ Selenium来完成,使用Selenium控制无界面浏览器PhantomJS来完成登录并获取cookie,然而携带cookie正常使用爬虫程序。
(5)    反爬
除了设置UA,代理,请求阈值等常规手段还有以下经验:
1.    尽量减少请求次数,能抓列表页就不抓详情页;
2.    抓取一个网站时,不要只看 Web 网站,还有 App页面,一般App的反爬虫措施比较少
3.    可以考虑多线程(一些成熟的框架如 scrapy都已支持),甚至分布式。
(6)    分布式
Scrapy-redis继承了scrapy的所有优点,在redis中有三个队列,分别是待爬URL队列,去重队列,爬取的数据。分布式中不同服务器同时使用同一个redis库,达到分布式爬取的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羊族的希望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值