网络爬虫核心工作
通过网络向指定的 URL 发送请求,获取服务器响应内容使用某种技术(如正则表达式、XPath 等)提取页面中我们感兴趣的信息高效地识别响应页面中的链接信息,分析这些链接递归执行此处介绍的第 1、2、3 步使用多线程有效地管理网络通信交互分析
正则表达式设计的初衷主要是处理文本信息HTML 文档不仅是文本文档,而且是结构化文档,使用XPath更合适多线程管理,核心工作通用,应由框架来完成scrapy包
专业的 Twisted 包(基于事件驱动的网络引擎包)高效地处理网络通信lxml(专业的 XML 处理包),cssselect 高效地提取 HTML 页面的有效信息提供了有效的线程管理,开发者只要使用 XPath 或 css 选择器定义自己感兴趣的信息依赖包
Twisted:为 Python 提供的基于事件驱动的网络引擎包lxml:一个处理 XML、HTML 文档的库,比 Python 内置的 xml 模块更好用pyOpenSSL:Python 用于支持 SSL(Security Socket Layer)的包cryptography:Python 用于加密的库scrapy核心组件
调度器 负责使用下载中间件从网络上下载资源下载器 下载数据后由scrapy引擎自动提交给蜘蛛蜘蛛 由开发者实现,蜘蛛提取到的信息由scrapy引擎以item对象的形式转交给Pipelinepipeline 接收Item对象,可将这些信息写入文件或数据库中Item 类就是一个 DTO(数据传输对象)pipelines 负责处理爬取到的信息scrapy shell
先用命令窗口 用XPath 从 HTML 文档中提取信息scrapy shell url 使用 Scrapy 提供的 shell 调试工具来抓取该页面中的信息scrapy shell -s USER_AGENT='Mozilla/5.0' url 让 Scrapy 伪装成 Firefox 来开启 shell 调试上述命令成功会进入shell,并提供scrapy变量,以便调试 scrapy,crawler,item,request,response,settings,spider函数fetch(url),fetch(req),shelp(),veiw(response) response.xpath ('//div[@class="job-primary"]/div/h3/a/div/text()').extract() 提取节点内容 shell根据response提前初始化了变量 sel,该selector根据response的类型自动选择最合适的分析规则(XML vs HTML) shell载入后,得到一个包含response数据的本地response变量response.body,response.headersresponse.selector.xpath() 映射快捷方法 response.xpath()response.selector.css() 快捷方法 ``xpath简化写法
表达式作用nodename匹配此节点的所有内容/匹配根节点//匹配任意位置的节点.匹配当前节点…匹配父节点@匹配属性nodename[expr]对该节点进行谓词限制text()匹配文件节点对象@attr匹配属性节点Scrapy项目开发流程
定义 Item 类 (确定信息呈现结构,读) 生成项目骨架 scrapy startproject <project_name> [project_dir]数据传输对象(DTO)的 编写 Spider 类 (抓节点,多个抓取源)核心 scrapy genspider [options] <name> <domain> 进入项目后执行,生成蜘蛛类将要爬取的各页面 URL 定义在 start_urls 列表中在 parse(self, response) 方法中通过 XPath 或 CSS 选择器提取项目信息 该返回的是一个迭代生成器 yield, 类似于goto语句,即可以中断当前函数体,让渡控制权 编写 pipelines.py 文件(存) 该文件负责将所爬取的数据写入文件或数据库中实现process_item(self, item, spider) 方法 配置settings.py 配置User-Agent配置使用pieplineselector 基本方法
xpath() 传入xpath表达式,返回表达式所有对应的所有节点的selector list列表css() 传入CSS表达式extract() 序列化该节点为unicode字符串并返回listre() 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表小记
需要将源码保存为utf-8生成项目 -> 进入项目生成蜘蛛extract(), extract_first() 节点对象方法,提取多个或单个信息数据流向 蜘蛛–> pipeline 入库…