《Python爬虫开发与项目实战》,了解一下


爬虫
通用爬虫 general purpose web crawler
聚焦爬虫 focused crawler
增量式网络爬虫 incremental web carwler
深层次爬虫 deep web crawler

爬行策略
广度优先
大站优先
反链策略:该网页被其他网页指向的次数

网页分析算法
基于用户行为的网页分析算法

基于网络拓扑的网页分析算法
基于网页粒度的分析算法
pageRank 谷歌就是这个
基于网页块粒度的分析算法
基于网站粒度的分析算法

基于网页内容的网页分析算法

正则
re

原子就是通用字符,用来进行匹配的

\w 任意一个字母、数字、下划线
\W 除字母、数字和下划线以外的任意一个字符
\d 十进制数字
\D 非十进制数字

re.match(pattern, string, flag).span
从起始位置匹配一个模式
span过滤信息,返回结果的出现的位置

re.search()
扫描整个字符串并进行匹配
在全文中进行检索匹配

全局匹配函数
p = re.compile()对正则表达式进行预编译
p.findall() 找出符合模式的所有结果

re.sub
根据正则表达式实现替换某些字符串的功能

解析方式

直接处理
当爬取的是ajax时可以直接解析json
也就是动态页面
页面的渲染是有js处理后的
分析ajax请求
使用Selenium/WebDriver 来加载
模拟浏览器加载
得到页面的源码
正则解析
beautifulSoup lxml
PyQuery
XPath

UrlLib 库

request 请求模块
error异常处理
parse url解析模块

Scrapy架构

Engine 控制数据流在系统的所有组件中流动
Scheduler 调度器从Engine接受Request将他们入队
Downloader 下载器负责获取页面数据并提供给引擎
Spider 用户编写用于分析Response 提取Item
Item Pipeline 处理 spider 提取出来的item
downloader middlewares 下载器中间件,在引擎和下载器之间特定钩子,处理downloader传递给引擎的response,可以在此扩展

spider中间件
处理spider的输入和输出

response.xpath(“.//*[@class=‘postTitle]/a/text()”).extract()

scrapy start project myproject

fetch “url” 使用scapy下载器下载给的url并将获取到的内容送到标准输出

scrapy bench 用于benchmark测试crapy在硬件上的效率

定义Item

scrapy 提供item类来满足这样的需求
Item对象是一种简单的容器
用来保存爬取到的数据
提供了类似于词典的api以及用于声明可用字段的简单语法
Item使用简单的class定义语法以及Field对象来声明
需要继承scrapy.Item

构建Item Pipeline

清理Html数据
验证爬取的数据的合法性,检查Item是否包含某些字段
查重并丢弃

每个Item Pipeline组件 是一个独立的python类
必须实现process_item方法
preocess_item(self,item,spoder)
返回一个Item或任何继承类对象

内置的FilesPipeline和ImagesPipeline

调试方法
Parse命令
Scrapy shell
logging

scrapy 提供了内置的telnet 终端,以供检查、控制Scrapy运行的进程

Spider是定义爬取的动作及分析网页结构的地方
爬取的循环流程
1、以入口url初始化Request,并设置回调函数,Request下载完毕返回Response,并作为参数传给回调函数,
spider中初始request是通过调用start_requests()方法来获取的,
start_requests()读取start_urls中的url,并以parse为回调函数生成Request

2、在回调函数那分析response,返回item对象、dict、request
或者一个包括三者的可迭代容器。
其中返回的request对象之后回经过scrapy处理,下载相应的内容,并调用设置的回调函数,可以是pares()或者其他函数

3、在回调函数内、可以使用选择器(selectors)或者第三方解析器来分析response,并根据分析的数据生成item

4、由spider返回的item可以经由item pipeline 被存到数据库或使用feed exports 存入到文件中

item与item loader
提供了一种便捷的方式填充抓取到的items
items提供了保存抓取数据的容器
item loader 提供的是填充容器的机制

内置的处理器
identity
takefirst
join
compose
mapcompose
selectjmes

item popeine

open_spder(self,spoder)
当spoder被开启时,这个方法被调用

close_spider(self,spider)
当spider被关闭时,这个方法被调用

from_crawler(cls,crawler)
从crawler属性中创建一个pipeline实例
crawler对象能够接触所有scrapy的核心组件

可以在open时建立数据库连接,close关闭连接

下载器中间件

介于Scrapy的request/response处理的钩子框架,
用于全局修改scrapy的request和response

激活下载器中间件
需要在配置文件中设置

process_request(request,spider)
当每个request通过下载中间件时,该方法被调用,

process_response(request,response,spider)
该方法主要用来处理产生的response

process_exception(request,exception,spider)
当下载处理器或process_request()抛出异常

spider中间件

是介入到scrapy的spider处理机制的钩子框架
用来处理发送给spider的response及spider产生的item和request

激活中间件

process_spider_input(response,spider)
当response通过spider中间件时,该方法被调用,处理该response

process_spider_out(response,result,spider)
当spider处理response返回result时,该方法被调用

process_spider_exception(response,exception,spider)
当spider或其他中间件抛出异常时,被调用

process_start_requests(start_requests,spider)
该方法以spider启动的request为参数

反爬虫

基于验证码的反爬虫
基于headers的反爬虫
基于用户行为的反爬虫
基于动态页面的反爬虫

动态设置UserAgent池
禁用Cookies
设置下载延时与自动限速
代理ip池

tor代理

分布式下载器Crawlera

Google cache 网页快照

爬虫项目步骤

1、创建工程,先定义Item,确定需要提取的结构化数据
2、创建spider
重写start_requests方法
解析功能方法
3、pipeline,主要完成的是item到数据库存储

部署
scrapyd

scrapy-client是一个专门用来发布scrapy爬虫的工具

增量式爬虫

只爬取新的内容,增量的核心在于快速去重

去重方案
对url去重
有些网站url存在,但是内容一致在变化
本质上都可以看作是针对字符串的去重方式

爬虫可能会在网络中形成换,
1、关系型数据库去重
每来一个url就启动一次数据库查询
2、缓存数据库去重
使用redis重的set数据类型
3、内存去重
将url直接存到set中,消耗内存过大
将url进行md5或者hash

采取bit-map方法,建立一个bitset,将url经过一个哈希函数映射到某一位,单一哈希函数发生冲突概率太高,容易发生误判

BloomFilter布隆过滤器
是一个多哈希函数映射的快速查找算法。
是一种空间效率很高的随机数据结构,它利用位数组很简洁的表示一个集合,并能判断一个元素是否属于这个集合,有较低的错误率

分布式爬虫

redis配置参数
appendfsync
指定更新日志条件
no:数据缓存时同步到磁盘
always:每次更新操作后,手动调用fsync
everysec:每秒同步一次

redis数据类型
string
hash
list
set
sorted set

国人写的爬虫框架

pyspider