本帖最后由 xandy 于 2016-10-25 10:58 编辑

1. 引言

前面文章的测试案例都用到了集搜客Gooseeker提供的规则提取器,在网页抓取工作中,调试正则表达式或者XPath都是特别繁琐的,耗时耗力,工作枯燥,如果有一个工具可以快速生成规则,而且可以可视化的即时验证,就能把程序员解放出来,投入到创造性工作中。

之前文章所用的例子中的规则都是固定的,如何自定义规则再结合提取器提取我们想要的网页内容呢?对于程序员来说,理想的目标是掌握一个通用的爬虫框架,每增加一个新目标网站就要跟着改代码,这显然不是好工作模式。这就是本篇文章的主要内容了,本文使用一个案例说明怎样将新定义的采集规则融入到爬虫框架中。也就是用可视化的集搜客GooSeeker爬虫软件针对亚马逊图书商品页做一个采集规则,并结合规则提取器抓取网页内容。

2. 安装集搜客GooSeeker爬虫软件

2.1 进入集搜客官网产品页面,下载对应版本。
我的电脑上已经安装了Firefox 38,所以这里只需下载爬虫。


2.2 安装爬虫
打开Firefox –> 点击菜单工具 –> 附加组件 –> 点击右上角附加组件的工具 –> 选择从文件安装附加组件 -> 选中下载好的爬虫xpi文件 –> 立即安装

下一步

下一步

3. 开始制作抓取规则

3.1 运行规则定义软件:点击浏览器菜单:工具-> MS谋数台 弹出MS谋数台窗口

3.2 在网址栏输入我们要采集的网站链接,然后回车。当页面加载完成后,在工作台页面依次操作:命名主题名 -> 创建规则 -> 新建整理箱 -> 在浏览器菜单选择抓取内容,命名后保存


4. 申请规则提取器API KEY

4.1 打开集搜客Gooseeke官网,注册登陆后进入会员中心 ->  API -> 申请API


5. 结合提取器API敲一个爬虫程序

5.1 引入Gooseeker规则提取器模块gooseeker.py(下载地址: https://github.com/FullerHua/gooseeker/tree/master/core), 选择一个存放目录,这里为E:\demo\gooseeker.py

5.2 与gooseeker.py同级创建一个.py后缀文件,如这里为E:\Demo\third.py,再以记事本打开,敲入代码:
注释:代码中的31d24931e043e2d5364d03b8ff9cc77e 就是API KEY,用你申请的代替;amazon_book_pc 是规则的主题名,也用你的主题名代替
  1. # -*- coding: utf-8 -*-
  2. # 使用GsExtractor类的示例程序
  3. # 以webdriver驱动Firefox采集亚马逊商品列表
  4. # xslt保存在xslt_bbs.xml中
  5. # 采集结果保存在third文件夹中
  6. import os
  7. import time
  8. from lxml import etree
  9. from selenium import webdriver
  10. from gooseeker import GsExtractor

  11. # 引用提取器
  12. bbsExtra = GsExtractor()   
  13. bbsExtra.setXsltFromAPI("31d24931e043e2d5364d03b8ff9cc77e", "amazon_book_pc") # 设置xslt抓取规则

  14. # 创建存储结果的目录
  15. current_path = os.getcwd()
  16. res_path = current_path + "/third-result"
  17. if os.path.exists(res_path):
  18.     pass
  19. else:
  20.     os.mkdir(res_path)

  21. # 驱动火狐
  22. driver = webdriver.Firefox()
  23. url = "https://www.amazon.cn/s/ref=sr_pg_1?rh=n%3A658390051%2Cn%3A!658391051%2Cn%3A658414051%2Cn%3A658810051&page=1&ie=UTF8&qid=1476258544"
  24. driver.get(url)
  25. time.sleep(2)

  26. # 获取总页码
  27. total_page = driver.find_element_by_xpath("//*[@class='pagnDisabled']").text
  28. total_page = int(total_page) + 1

  29. # 用简单循环加载下一页链接(也可以定位到下一页按钮,循环点击)
  30. for page in range(1,total_page):
  31.     # 获取网页内容
  32.     content = driver.page_source.encode('utf-8')
  33.    
  34.     # 获取docment
  35.     doc = etree.HTML(content)
  36.     # 调用extract方法提取所需内容
  37.     result = bbsExtra.extract(doc)
  38.    
  39.     # 保存结果
  40.     file_path = res_path + "/page-" + str(page) + ".xml"
  41.     open(file_path,"wb").write(result)
  42.     print('第' + str(page) + '页采集完毕,文件:' + file_path)
  43.    
  44.     # 加载下一页
  45.     if page < total_page - 1:
  46.         url = "https://www.amazon.cn/s/ref=sr_pg_" + str(page + 1) + "?rh=n%3A658390051%2Cn%3A!658391051%2Cn%3A658414051%2Cn%3A658810051&page=" + str(page + 1) + "&ie=UTF8&qid=1476258544"
  47.         driver.get(url)
  48.         time.sleep(2)
  49. print("~~~采集完成~~~")
  50. driver.quit()
复制代码

5.3 执行third.py,打开命令提示窗口,进入third.py文件所在目录,输入命令 :python third.py 回车
5.4 查看结果文件,进入third.py文件所在目录,找到名称为result-2的文件夹然后打开

6. 总结

制作规则时,由于定位选择的是偏好id,而采集网址的第二页对应页面元素的id属性有变化,所以第二页内容提取出现了问题,然后对照了一下网页元素发现class是一样的,果断将定位改为了偏好class,这下提取就正常了。下一篇《在Python3.5下安装和测试Scrapy爬网站》简单介绍Scrapy的使用方法。

7. 集搜客GooSeeker开源代码下载源



举报 使用道具
| 回复

共 5 个关于本帖的回复 最后回复于 2017-3-13 21:36

沙发
wenk1107 初级会员 发表于 2017-3-13 19:30:05 | 只看该作者
奇怪,为什么只有第一个案例first.py可以用,second.py/third.py采集下来都是空白的?是不是api过期了,但是用我自己的api也是失败的。
举报 使用道具
板凳
shenzhenwan10 金牌会员 发表于 2017-3-13 20:02:26 | 只看该作者
可能是api过期了, 我们检查一下
举报 使用道具
地板
shenzhenwan10 金牌会员 发表于 2017-3-13 20:03:19 | 只看该作者
wenk1107 发表于 2017-3-13 19:30
奇怪,为什么只有第一个案例first.py可以用,second.py/third.py采集下来都是空白的?是不是api过期了,但是 ...

用自己的api, 需要先在MS谋数台里创建并保存规则.
你是怎么使用的?

举报 使用道具
5#
wenk1107 初级会员 发表于 2017-3-13 20:35:33 | 只看该作者
恩,用gooseeker成功创建规则,并且采集到了数据.但是申请api后,用这个python代码采集数据为空,是不是要安装Scrapy,安装scrapy的时候提示unable to find vcvarsall.bat,又是如何解决呢?
举报 使用道具
6#
shenzhenwan10 金牌会员 发表于 2017-3-13 21:36:48 | 只看该作者
Scrapy的安装可以参考这篇文章 《在Python3.5下安装和测试Scrapy爬网站
举报 使用道具
您需要登录后才可以回帖 登录 | 立即注册

精彩推荐

  • Gephi社会网络分析-马蜂窝游记文本分词并同
  • Gephi社会网络分析-基于马蜂窝游记文本以词
  • 知乎话题文本根据词语间距筛选后生成共词矩
  • 马蜂窝游记文本分词后以词语间距为筛选条件
  • 学习使用apriori算法挖掘关联关系

热门用户

GMT+8, 2024-4-19 11:26