数据抓取学习(爬虫via scrapy)

0. 使用 Python 基础内容可以做一些小分析和词云可视化

python中文分词,可以使用 jieba 分词。 汉语与英语分割不同。 https://github.com/fxsjy/jieba
中文网站有时会遇到编码问题,可用codecs
数据分析库,可用pandas 『两种数据结构——Series和DataFrame』
matplotlib.pyplot 可视化用
from wordcloud import WordCloud 词云包,提供生成词云可视化
0.1 导入相关包
0.2 导入文件,分词『』
0.3 去停用词『常需要根据自己的需要自定义词表』
0.4 统计词频

file = codecs.open(u'琅琊榜.txt', r)  #用codecs 读取文件,处理文件编码问题
jieba.load_userdict(u"self_def_dict.txt") 
#  [载入用户自定义词典](https://github.com/fxsjy/jieba#2-添加自定义词典)
# [通过用户自定义词典来增强歧义纠错能力Issue]https://github.com/fxsjy/jieba/issues/14
segs = jieba.cut(content)    # 基本斷詞用法,使用預設詞庫
[jieba 的几种分词模式](https://github.com/fxsjy/jieba#1-分词)
words_df = pandas.DataFrame({'segment': segment})  # DataFrame较 list 更方便进行数据处理分析
words_df=words_df[~words_df.segment.isin(stopwords.stopword)]     # 用~移除部分词汇 「来自 pandas 中的boolean-indexing 功能」
words_stat=words_df.groupby(by=['segment'])['segment'].agg({"计数":numpy.size})
words_stat=words_stat.reset_index().sort(columns="计数",ascending=False)
words_stat
#使用 groupby 方法进行统计分析 
# http://pandas.pydata.org/pandas-docs/stable/groupby.html

1. 数据抓取技能

做数据分析,首先需要获取数据。

1.1 背景知识:Xpath 与网页内容定位

XPath 可用来在 XML 文档中对元素和属性进行遍历。简单说,Xpath 就是选取 XML文件中节点的方法。所谓节点(node),就是 XML 文件中最小的构成单位,一共分为7种。

  • element 元素节点
  • attribute 属性节点
  • text 文本节点
  • namespace 名称空间节点
  • processing-instruction 处理命令节点
  • comment 注释节点
  • root 根节点

xpath 通过”路径表达式”(Path Expression)来选择节点。为了缩小定位范围,往往还需要增加过滤条件。过滤的方法就是用“[ ]”把过滤条件加上

  • “//” 表示选择任意位置的某个节点 「//book」
  • “.” 表示从当前范围找。“..”和“.”分别被用来表示父节点和本节点。
  • “@” 表示选择某个属性 「//@lang」如@id表示属性id,类似的还可以使用如@name, @value, @href, @src, @class….
  • 函数text()的意思则是取得节点包含的文本。
  • 函数position()的意思是取得节点的位置。比如“li[position()=2]”表示取得第二个li节点,它也可以被省略为“li[2]”。
  • ”可以代替所有的节点名,比如用”/html/body//span”可以取出body下第二级的所有span,而不管它上一级是div还是p或是其它什么东东。
  • “descendant::”前缀可以指代任意多层的中间节点,它也可以被省略成一个“/”。比如在整个HTML文档中查找id为“leftmenu”的 div,可以用“/descendant::div[@id=’leftmenu’]”,也可以简单地使用“ //div[@id=’leftmenu’]”。
  • “following-sibling::”前缀就如其名所说,表示同一层的下一个节点。”following-sibling::*”就是任意下一个节点,而“following-sibling::ul”就是下一个ul节点。
    Ref: xpath 路径表达式笔记 - 阮一峰
    Ref: Xpath cheatsheet
    Ref: XML Path Language (XPath) - W3C

1.2 使用 Scrapy 进行数据抓取

Scrapy is an open sourse and collaborative framework for extracting the data you need form websites. In a fast, simple, yet extensible way.

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

从网页中提取数据有很多方法。Scrapy使用了一种基于 XPath 和 CSS 表达式机制: Scrapy Selectors 。 关于selector和其他提取机制的信息请参考 Selector文档

1.2.1 Scrapy结构

Scrapy 中包含:
- 引擎 (Scrapy Engine) ,
- 调度器 (Scheduler),『只负责安排工作,类似 DFS 过程』
- 下载器 (Downloader) , 『只负责下载』
- 蜘蛛 (Spiders),『!核心,负责爬取解析网页内容』
- 项目管道 (Item Pipeline),
- 下载器中间件 (Downloader Middlewares),
- 蜘蛛中间件 (Spider Middlewares),
- 调度中间件 (Scheduler Middlewares)

scrapy 1.0结构

1.2.2 Scrapy的工作流workflow:

  • 绿线是数据流向
    • 从初始 URL 开始,Scheduler 会将其交给 Downloader 进行下载
    • 下载之后交给 Spider 进行分析
    • Spider 分析出来的结果有两种
      • 一种是需要进一步抓取的链接,如“下一页”的链接,它们会被传回 Scheduler
      • 另一种是需要保存的数据,它们被送到 Item Pipeline 里,进行后期处理(详细分析、过滤、存储等)。
    • 在数据流动的通道里还可以安装各种中间件,进行必要的处理。
  • 爬取流程
    • 先初始化请求URL 列表,并指定下载

2. 使用 Scrapy 进行数据爬取

scrapy shell 是一个工具,对网页发起请求,返回内容

scrapy shell http://你要调试xpath的地址

scrapy shell “http://quotes.toscrape.com/
返回的内容被包装为一个 response 对象 ,使用 xpath().extract() 可以定位抽取内容
response.xpath(‘//span[@class=”text”]/text()’).extract_first()
response.xpath(‘//small[@class=”author”]/text()’).extract()

2.1 组件 Spider 与简单爬取

scrapy runspider spider.py –o xxx.json

这是最简单的spider爬取 。通过继承scrapy组件spider,只需要写一个脚本即可。-o 表示输出,推荐将爬取结果以json、xml、csv格式存储,方便导入数据库进一步分析。

spider 爬取流程
1. 先初始化请求URL列表,并指定下载后处理response的回调函数。初次请求URL通过start_urls指定,调用start_requests()产生Request对象,然后注册parse方法作为回调
2. 在parse回调中解析response并返回字典,Item对象,Request对象或它们的迭代对象。Request对象还会包含回调函数,之后Scrapy下载完后会被这里注册的回调函数处理。
3. 在回调函数里面,你通过使用选择器(同样可以使用BeautifulSoup,lxml或其他工具)解析页面内容,并生成解析后的结果Item。
4. 最后返回的这些Item通常会被持久化到数据库中(使用Item Pipeline)或者使用Feed exports将其保存到文件中。

Ref: Scrapy Tutorial
Tutorial例子scrape quotes.toscrape.com, a website that lists quotes from famous authors. quotes.toscrape.com

2.2 爬取静态网站「发送请求时,内容已经写死」

scrapy spider 有几种爬取方式:
1. 爬取1页内容
2. 按照给定列表爬去多页
3. “下一页”类型
4. 按照链接进行爬取(根据不同的规则分析链接)
scrapy 有几种不同类型的 spider:

以 stackoverflow 为例

2.3.1 爬取一页

eg. 对stackoverflow首页抓取

stackoverflow_spider.py
scrapy runspider stackoverflow_spider.py -o result.json

# 使用 XPaths 时,建议使用 relative XPaths
# 0. # this is wrong - gets all ‘p’ from the whole document
# >>> for p in divs.xpath(‘//p’):
# 1. # extracts all ‘p’ inside
# >>> for p in divs.xpath(‘.//p’):
# 2. # extracts all direct ‘p’ children
# >>> for p in divs.xpath(‘p’):

2.3.2 按照给定列表爬取多页

eg. cnblog的精华区,地址是有规律的,第 N 页由最后一个数字决定。

2.3.3 通过“下一页”按钮爬取

2.3.4 根据链接,按规则分别爬取

e.g. 通过腾讯新闻首页,通过分析新闻标题链接,爬取其详情页面。

Notes:
sogou有一个针对微信公众号的搜索功能,可以对微信进行抓取。
taobao 需要努力克服反爬机制

2.3 初始化创建 Scrapy 项目,自动化生成爬虫项目框架

参考学习: scrapy tutorial
Creating a project

scrapy startproject XXXX

  • 几种不同类型的Spider:
    • CrawlSpider 链接爬取蜘蛛
      • 属性 rules: Rule 对象列表,定义规则
      • CrawlSpider 定义爬取 不同url 的规则
    • XMLFeedSpider
      • XML 订阅蜘蛛
      • 通过某个指定的节点来遍历
    • CSVFeedSpider
      • (类似 XML 订阅蜘蛛)
      • 逐行迭代,调用 parse_row()解析
  • Item 是保存数据的地方
    • 定义和加载抓取内容model的容器
  • Pipeline 主要是辅助数据存储与处理的。
    • 当一个 item 被蜘蛛爬取到后,会被发送给 Item Pipeline,然后多个组件安装顺序处理这个 item。
      -Item Pipeline 常用场景
      - 清理 HTML 数据
      - 验证被抓取的数据(检查 item 是否包含某些字段)
      - 重复性检查(然后丢弃)
      - 将抓取的数据存储到数据库中,如设置 json 存储
      • 关于 Item Pipeline 实施:
        • 定义一个 Python 类,实现方法 process_item(self, item, spider)即可,返回一个字典或 Item,或者抛出 DropItem 异常丢弃这个 Item。
        • 经常会实现以下方法:
          • open_spider(self, spider) 蜘蛛打开时执行
          • close_spider(self, spider) 蜘蛛关闭时执行
          • from_crawler(cls, crawler) 可访问核心组件,比如配置和信号,并注册钩子函数到 Scrapy 中。
  • Middleware是辅助 spider 和 downloader 的。eg. 其中有 ProxyMiddleware 可以配置多个代理
  • Setting

运行, 基于 project 的 crawler :
打印当前目录下所有的 spider

scrapy list
————a web crawler of cnblog 一个 cnblog 的爬虫
cnblogs
开始抓取:
scrapy crawl cnblogs

Ref1: Scrapy documentation
Ref2: Scrapy 1.0 文档

2.4 爬取动态网站「有 js,ajax。通常需要配置 middleware 来渲染」

  • 回顾复习 Scrapy 框架
  • 有些网站需要登录后才能大量抓取
  • 动态网站,需要模拟浏览器,发起 js 请求 『包括”获取更多内容”按钮』
  • 微信无公开接口,可用搜狗已经抓取的信息进一步分析。
  • 抓图

  • -
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值