环境配置
- Ubuntu 16.04
- Python 3.5
技术框架
- Scrapy
- Selenium
- PhantomJS
需求目标
对网址http://liuyan.cjn.cn/index.html
进行数据爬取
- 主页面
- 列表页面,需要利用
selenium+phantomJS
模拟点击加载更多
按钮
- 详情页面
- 把
主页面
中的红框中的各区(功能区)
、政府部门
、法检及其他单位
等作为一级类保存,然后依次爬取一级类中各个分类 - 进入到
列表页面
,因为此页面是动态加载,并且是简介列表,因此需要加载完所有列表进入到详情页面。 - 进入到
详情页面
,爬取相应内容。
设计方案
动态爬取数据一般有两种方法
- 分析包,构造Request
- 通过模拟浏览器行为加载页面
通过尝试,第一种方法对于此网站不适合,采用第二种方法。
采用Scrapy+Selenium+PhantomJS
来进行动态网页的爬取。
Selenium
Selenium是一个自动化测试工具,本文用到的是其Webdriver
,用其来操作浏览器,可以操作多种主流浏览器,如Chrome,Firefox等,下文中的PhantomJS
是一种无界面的浏览器。
PhantomJS
PhantomJS是一个无界面浏览器,提供JavaScript接口。通过这个工具,可以进行页面的加载、解析、操作等。
爬取方案
- 先爬取
主页面
各个主类(如各区(功能区)
、政府部门
等)下的子类链接,如(江岸区、江夏区等) - 按照先前爬取的子类链接依次打开跳转到
列表界面
,然后利用Selenium+PhantomJS
模拟浏览器动态加载完全部列表,解析出所有列表的链接,跳转到详情页面
- 进入到
详情页面
,解析所要提取的内容
详细步骤
安装Scrapy
sudo pip3 install scrapy |
安装PhantomJS
安装PhantomJS
sudo apt-get install phantomjs
apt-get会安装不完整,需要安装以下
sudo apt-get install nodejs
sudo apt-get install nodejs-legacy
sudo apt-get install npm
sudo npm -g install phantomjs-prebuilt
安装Selenium
sudo pip3 install selenium |
使用Scrapy
创建新工程
scrapy startproject xxxx
编辑
items.py
文件from scrapy import Item
from scrapy import Field
class MessageboardspiderItem(Item): |
|
编辑
pipelines.py
文件import json
import codecs
baseDir = '/home/t/dataset/msgBoard/department/'
class DistrictPipeline(object):
def process_item(self, item, spider):
with codecs.open(baseDir+item['dir_name']+'/data.json','a+',encoding='utf-8') as f:
self.file=f
line=json.dumps(dict(item),ensure_ascii=False)+'\n'
self.file.write(line)
return item编辑
settings.py
文件编辑pipelines的设置,把如下内容的注释去掉即可
#ITEM_PIPELINES = {
# 'messageBoardSpider.pipelines.DistrictPipeline': 300,
#}运行爬虫
在项目根目录下新建一个
main.py
文件,运行爬虫执行该文件即可。from scrapy.cmdline import execute
execute(['scrapy','crawl','spider'])【注】
execute(['scrapy','crawl','spider'])
其中
spider
是爬虫名,按需更改即可。