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)
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
scrapy startproject XXXX
- 几种不同类型的Spider:
- CrawlSpider 链接爬取蜘蛛
- 属性 rules: Rule 对象列表,定义规则
- XMLFeedSpider
- XML 订阅蜘蛛
- 通过某个指定的节点来遍历
- CSVFeedSpider
- (类似 XML 订阅蜘蛛)
- 逐行迭代,调用 parse_row()解析
- CrawlSpider 链接爬取蜘蛛
- 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 中。
- 关于 Item Pipeline 实施:
- 当一个 item 被蜘蛛爬取到后,会被发送给 Item Pipeline,然后多个组件安装顺序处理这个 item。
- 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 请求 『包括”获取更多内容”按钮』
- 微信无公开接口,可用搜狗已经抓取的信息进一步分析。
抓图
- -