Fork me on GitHub

利用scrapy爬虫收集数据

利用scrapy这个python包来爬取数据是一件非常方便的事情。以下记录了我使用scrapy抓取二手交易网站信息索引页的步骤以及出现的问题。

scrapy的模块结构

scrapy_structure
如图所示,scrapy分为5个主要模块:

  1. scrapy engine: 连接其它4个模块,处理他们之间的数据流和指令流
  2. Spiders: 网页处理模块。对提取到的网页进行解析,提取指定信息;生成下一个要提取的网页
  3. Scheduler: 网页调度模块。调度网页请求,从spider接收新的网页请求,为downloader提供下载请求
  4. Downloader: 网页下载模块。下载网页
  5. Item Pipeline: 数据处理模块。处理从spiders解析的数据,并存储到数据库中。

数据抓取流程

以下是我抓取网站deyi时的步骤:

  1. 初始化项目 scrapy startproject deyi
  2. 在项目目录内建立spider scrapy genspider -t crawl deyiWeb deyi.com
  3. 修改./deyi/spider/deyiMobi.py,写自己的start_requests和parse函数。parse函数中就是你要抓紧的数据,建议使用xpath来处理html数据
  4. 修改./deyi/item.py,加入deyiMobiItem类,添加对应字段,并在spider中引用这个类
  5. 修改./deyi/piplines.py,加入deyiMobiPipeline类和对应的输出方法。这里是对取到的数据进行处理的地方
  6. 修改./deyi/settings.py,在item_pipelines中加入对应的类名。如果需要调整延迟的话可以调整download_delay
  7. 在/etc/crontab中设置计划任务

遇到的问题

  1. 手机版只能爬5020页,网页版只能爬100050页,而它总共有36w贴。通过页面爬不到的数据可以通过搜索得到。
  2. 在取dgtle时,发现数据是包含在div[class = ‘tradebox *’]中的需要用xpath的contain方法来提取。
  3. 在取newsmth时,发现取到的是escaped_fragment页面,而不是真实页面,这说明有浏览器的限定
  4. 对于需要帐号登录的网站,需要使用scrapy中对应的登陆功能
  5. 把数据导入数据库时显示乱码。解决这个问题需要满足三个条件:建立数据库编码选择utf-8;建立表时的编码选择utf-8;python代码使用utf-8编码。再加一个条件,mysql的my.conf需要加一些说明为utf-8的句子
  6. 我原本想把所有网站都放在同一个project中,后来发现数据会串行的通过所有启动了的pipeline,无法为某一个spider指定pipeline,所以还是每个网站建一个project吧。

信息处理方向

  1. 数据title进行分词处理,给每个链接分配tag.
  2. 各个商品的价格关于时间的走向;各个地区出售商品的频率
  3. 数据导入数据库,建立服务读取数据,加入搜索功能
No pain, No gain