<commit_before>


---
链家的同学请原谅我，但你们的网站做的真是不错。

## 设计网页采集器


我们以爬取链家二手房为例，介绍网页采集器的使用。首先双击图标，加载采集器：

![新建采集器](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506161543642-715415702.png)



在最上方的地址栏中，输入要采集的目标网址，本次是http://bj.lianjia.com/ershoufang/。并点击刷新网页。此时，下方展示的是获取的html文本，目前工作模式默认是`List`。

![输入网址刷新](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506161656798-1250424975.png)


原始网站页面如下：

![QQ截图20160501121150.jpg-88kB][13]

此时，有两种做法来获取想要的房产数据：

### 全自动嗅探：手气不错

直接无脑点击`手气不错`,弹出下面的界面：

![手气不错](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506162114847-660106933.png)

对于链家这个例子，你可以修改每个列对应的名字，如房价，总面积等。或者更懒一点，直接点击`确认结果`即可。

> Hawk3的手气不错功能得到大大加强，大部分手工操作已经不需要了。

### 手动模式

在一些情况下，由于软件不知道到底要获取哪些内容，因此需要手工给定几个关键字， 让Hawk搜索关键字， 并获取位置。


以上述页面为例，通过检索820万和51789（单价,每次采集时都会有所不同），我们就能通过DOM树的路径，找出整个房源列表的根节点。

下面是实际步骤

![手工添加属性](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506162447594-2020334544.png)

由于要抓取列表，所以**读取模式**选择**List**。 填入搜索字符94.71， 发现能够成功获取XPath,左边的源代码框会自动跳转到对应位置， 编写属性为“面积” ，点击**添加**，即可添加一个属性。类似地，再填入303，设置属性名称为“总价”，即可添加另外一个属性。

如果发现有错误，可点击**编辑集合**， 对属性进行删除，修改和排序。

你可以类似的将所有要抓取的特征字段添加进去，或是直接点击**手气不错**，系统会根据目前的属性，推测其他属性:

属性的名称是自动推断的，如果不满意，可以**修改列表第一列的属性名**，点击刷新后更新。

工作过程中，可点击**提取测试** ，随时查看采集器目前的能够抓取的数据内容。这样，一个链家二手房的网页采集器即可完成。可在网页采集器最上方，修改采集器的模块名称，这样就方便`数据清洗`任务调用该采集器。



##  设计数据清洗 流程
###  构造url列表

在上一节介绍了如何实现一个页面的采集，但如何采集所有二手房数据呢？ 这涉及到翻页。

![链家翻页控件](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506212225505-877226286.png)


还是以链家为例，翻页时，我们会看到页面是这样变换的：
```
http://bj.lianjia.com/ershoufang/pg2/
http://bj.lianjia.com/ershoufang/pg3/
…
```
因此，需要构造一串上面的url. 聪明的你肯定会想到， 应当先生成一组序列， 从1到100（假设我们只抓取前100页）。

 1. 除了在软件的欢迎页面上双击**数据清洗**，也可以`系统状态视图`中`已加载任务`列表下，点击加号，快速创建新的任务:
 
 
 ![更方便地添加任务](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506162912806-1622106420.png)

 在左侧的搜索栏中搜索**生成区间数**， 将该模块拖到右侧上方的栏目中：

 ![QQ截图20160501121554.jpg-29.8kB][18]
 
 2. 在右侧栏目中双击生成区间数，可弹出设置窗口， 为该列起名字(id), 最大值填写为100,生成模式默认为Append:
  *为什么只显示了前20个？ 这是程序的虚拟化机制， 并没有加载全部的数据，可修改**采样量**（默认为20）。*

 3. 将数字转换为url, 熟悉C#的读者，可以想到string.format, 或者python的%符号：搜索**合并多列**，并将其拖拽到刚才生成的id列， 编写format为下图的格式，即可将原先的数值列变换为一组url
 
 ![QQ截图20160501121916.jpg-22.9kB][19]
 
 *(如果需要多个列合并为一个列， 则在“其他项” 栏目中填写其他列的列名，用空格分割， 并在format中用{1},{2}..等表示)*

  (由于设计的问题，数据查看器的宽度不超过150像素，因此对长文本显示不全，可以点击单元格弹出对应完整文本。

##  调用网页采集器

生成这串URL之后，我们即可将刚才已经完成的网页采集器处理这串url。

拖拽**从爬虫转换**到当前的url，在**爬虫选择** 栏目中选择刚才配置的采集器名称。
（不少朋友在此处出现问题，需要在`从爬虫选择`模块中，填写你配置的网页采集器名称，如果没有修改，则默认就是`网页采集器`）

之后，系统就会转换出爬取的前20条数据：

![QQ截图20160501122007.jpg-127.3kB][20]

可以看到， 数据中“属性3” 列包含html转义符， 

拖拽**html字符转义**，到属性3列，即可自动转换所有转义符。

![QQ截图20160501122026.jpg-81.4kB][21]

如果要修改列名，在最上方的列名上直接修改， 点击回车即可修改名字。

where（面积）列中包含数字，想把数字提取出来，可以将**提取数字**模块拖拽到该列上，所有数字即可提取出来。

类似地，可以拖拽**字符分割**或**正则分割** 到某一列，从而分割文本和替换文本。此处不再赘述。

有一些列为空，可以拖拽**空对象过滤器** 到该列，那么该列为空的话会自动过滤这一行数据。

## 保存和导出数据

需要保存数据时，可以选择写入文件，或者是临时存储（本软件的数据管理器），或是数据库。这就是执行器的作用。

> 执行器代表一些有副作用的模块，在调试模式中它们不会执行，只有在运行时才会生效。

拖**写入数据表**到任意一列， 并填入**新建表名**(如链家二手房)

![QQ截图20160501122057.jpg-32kB][22]

下图是这次操作的所有子模块列表：

![所有子模块列表]https://images2018.cnblogs.com/blog/287060/201805/287060-20180506212412941-2067892490.png)


之后，即可对整个过程进行操作：

选择**串行模式**或**并行模式**， 并行模式使用线程池， 可设定最多同时执行的线程数（最好不要超过100）。推荐使用并行模式，

![串行模式和并行模式选择](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506212447521-940810659.png)


点击**执行**按钮，即可在任务管理视图中采集数据。


![并行执行效果](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506212534331-2087912676.png)


之后，在**数据管理**的数据表**链家二手房**上点击右键， 选择另存为， 导出到Excel,Json等，即可将原始数据导出到外部文件中。

![保存到文件](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506212628260-1233762256.png)<commit_msg>fix typo<commit_after>


---
链家的同学请原谅我，但你们的网站做的真是不错。

## 设计网页采集器


我们以爬取链家二手房为例，介绍网页采集器的使用。首先双击图标，加载采集器：

![新建采集器](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506161543642-715415702.png)



在最上方的地址栏中，输入要采集的目标网址，本次是http://bj.lianjia.com/ershoufang/。并点击刷新网页。此时，下方展示的是获取的html文本，目前工作模式默认是`List`。

![输入网址刷新](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506161656798-1250424975.png)


原始网站页面如下：

![QQ截图20160501121150.jpg-88kB][13]

此时，有两种做法来获取想要的房产数据：

### 全自动嗅探：手气不错

直接无脑点击`手气不错`,弹出下面的界面：

![手气不错](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506162114847-660106933.png)

对于链家这个例子，你可以修改每个列对应的名字，如房价，总面积等。或者更懒一点，直接点击`确认结果`即可。

> Hawk3的手气不错功能得到大大加强，大部分手工操作已经不需要了。

### 手动模式

在一些情况下，由于软件不知道到底要获取哪些内容，因此需要手工给定几个关键字， 让Hawk搜索关键字， 并获取位置。


以上述页面为例，通过检索820万和51789（单价,每次采集时都会有所不同），我们就能通过DOM树的路径，找出整个房源列表的根节点。

下面是实际步骤

![手工添加属性](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506162447594-2020334544.png)

由于要抓取列表，所以**读取模式**选择**List**。 填入搜索字符94.71， 发现能够成功获取XPath,左边的源代码框会自动跳转到对应位置， 编写属性为“面积” ，点击**添加**，即可添加一个属性。类似地，再填入303，设置属性名称为“总价”，即可添加另外一个属性。

如果发现有错误，可点击**编辑集合**， 对属性进行删除，修改和排序。

你可以类似的将所有要抓取的特征字段添加进去，或是直接点击**手气不错**，系统会根据目前的属性，推测其他属性:

属性的名称是自动推断的，如果不满意，可以**修改列表第一列的属性名**，点击刷新后更新。

工作过程中，可点击**提取测试** ，随时查看采集器目前的能够抓取的数据内容。这样，一个链家二手房的网页采集器即可完成。可在网页采集器最上方，修改采集器的模块名称，这样就方便`数据清洗`任务调用该采集器。



##  设计数据清洗 流程
###  构造url列表

在上一节介绍了如何实现一个页面的采集，但如何采集所有二手房数据呢？ 这涉及到翻页。

![链家翻页控件](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506212225505-877226286.png)


还是以链家为例，翻页时，我们会看到页面是这样变换的：
```
http://bj.lianjia.com/ershoufang/pg2/
http://bj.lianjia.com/ershoufang/pg3/
…
```
因此，需要构造一串上面的url. 聪明的你肯定会想到， 应当先生成一组序列， 从1到100（假设我们只抓取前100页）。

 1. 除了在软件的欢迎页面上双击**数据清洗**，也可以`系统状态视图`中`已加载任务`列表下，点击加号，快速创建新的任务:
 
 
 ![更方便地添加任务](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506162912806-1622106420.png)

 在左侧的搜索栏中搜索**生成区间数**， 将该模块拖到右侧上方的栏目中：

 ![QQ截图20160501121554.jpg-29.8kB][18]
 
 2. 在右侧栏目中双击生成区间数，可弹出设置窗口， 为该列起名字(id), 最大值填写为100,生成模式默认为Append:
  *为什么只显示了前20个？ 这是程序的虚拟化机制， 并没有加载全部的数据，可修改**采样量**（默认为20）。*

 3. 将数字转换为url, 熟悉C#的读者，可以想到string.format, 或者python的%符号：搜索**合并多列**，并将其拖拽到刚才生成的id列， 编写format为下图的格式，即可将原先的数值列变换为一组url
 
 ![QQ截图20160501121916.jpg-22.9kB][19]
 
 *(如果需要多个列合并为一个列， 则在“其他项” 栏目中填写其他列的列名，用空格分割， 并在format中用{1},{2}..等表示)*

  (由于设计的问题，数据查看器的宽度不超过150像素，因此对长文本显示不全，可以点击单元格弹出对应完整文本。

##  调用网页采集器

生成这串URL之后，我们即可将刚才已经完成的网页采集器处理这串url。

拖拽**从爬虫转换**到当前的url，在**爬虫选择** 栏目中选择刚才配置的采集器名称。
（不少朋友在此处出现问题，需要在`从爬虫选择`模块中，填写你配置的网页采集器名称，如果没有修改，则默认就是`网页采集器`）

之后，系统就会转换出爬取的前20条数据：

![QQ截图20160501122007.jpg-127.3kB][20]

可以看到， 数据中“属性3” 列包含html转义符， 

拖拽**html字符转义**，到属性3列，即可自动转换所有转义符。

![QQ截图20160501122026.jpg-81.4kB][21]

如果要修改列名，在最上方的列名上直接修改， 点击回车即可修改名字。

where（面积）列中包含数字，想把数字提取出来，可以将**提取数字**模块拖拽到该列上，所有数字即可提取出来。

类似地，可以拖拽**字符分割**或**正则分割** 到某一列，从而分割文本和替换文本。此处不再赘述。

有一些列为空，可以拖拽**空对象过滤器** 到该列，那么该列为空的话会自动过滤这一行数据。

## 保存和导出数据

需要保存数据时，可以选择写入文件，或者是临时存储（本软件的数据管理器），或是数据库。这就是执行器的作用。

> 执行器代表一些有副作用的模块，在调试模式中它们不会执行，只有在运行时才会生效。

拖**写入数据表**到任意一列， 并填入**新建表名**(如链家二手房)

![QQ截图20160501122057.jpg-32kB][22]

下图是这次操作的所有子模块列表：

![所有子模块列表][https://images2018.cnblogs.com/blog/287060/201805/287060-20180506212412941-2067892490.png)


之后，即可对整个过程进行操作：

选择**串行模式**或**并行模式**， 并行模式使用线程池， 可设定最多同时执行的线程数（最好不要超过100）。推荐使用并行模式，

![串行模式和并行模式选择](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506212447521-940810659.png)


点击**执行**按钮，即可在任务管理视图中采集数据。


![并行执行效果](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506212534331-2087912676.png)


之后，在**数据管理**的数据表**链家二手房**上点击右键， 选择另存为， 导出到Excel,Json等，即可将原始数据导出到外部文件中。

![保存到文件](https://images2018.cnblogs.com/blog/287060/201805/287060-20180506212628260-1233762256.png)
{'fraction_non_alphanumeric': 0.1621732026143791, 'fraction_numerical': 0.17592592592592593, 'mean_word_length': 8.767287234042554, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 7, 'https://': 20, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6504755', 'n_tokens_mistral': 6433, 'n_tokens_neox': 6449, 'n_words': 218}