PySpider爬取去哪儿攻略数据项目
1 创建项目
- 点击WEB中的Create创建项目
- 填入相关项目名和其实爬取URL
- 创建后进入项目首页
- 右边 Handler 是pyspider的主类,整个爬虫一个Handler,其中可定义爬虫的爬取、解析、存储逻辑;crawl_config 中定义项目爬取配置;on_start() 爬取入口,通过调用 crawl() 方法新建爬取请求,第一个参数是爬取的URL,另外一个参数callback指定爬取成功后的解析方法,即index_page()。index_page() 接收Response参数,Response对接了pyquery,可直接调用doc()解析页面;detail_page() 方法接收Response参数,抓取详情页信息,不生成新的请求,对Response解析后以字典形式返回数据。
- 左边,上面绿色和灰色是运行参数内容,下面点击左边RUN按钮,运行项目,follow中是请求连接,点击连接右边运行三角,进入页面;html是源码;web是渲染页面; enable css selecter helper帮助进行css选择,在右边代码中选中doc方法引号中内容后,点击web窗口右上方箭头实现右边代码css选择替换;massage是页面信息。
- 点击run运行项目
- 发现follows中出现一条消息,点击follows
- 出现如下界面
- 点击三角运行符号,进入该界面
- 出现页面所有请求后,点击HTML显示源码,点击web展示页面,如果web窗口太小,可以通过开发者模式调整(尝试网上说的修改debug.min.css失败)
- 选择右边index_page()方法中的css选择器内容,点击左边enable css selecter helper然后选择对应元素,在3位置出现选择的元素后,点击右边箭头,对右边代码选中内容进行替换
- 再次点击左边run,follows变成10条选中css的请求连接。
- 要想选择多页,即实现自动翻页爬取,修改index_page()内容
@config(age=10 * 24 * 60 * 60) def index_page(self, response): for each in response.doc('li > .tit > a').items(): self.crawl(each.attr.href, callback=self.detail_page) next=response.doc('.next').attr.href self.crawl(next,callback=self.index_page)
- 再次点击run,follows变成11(多了next)
- 随便点进一个内容连接,发现没有图片,需要修改crawl添加fetch参数,修改后,重新run
self.crawl(each.attr.href, callback=self.detail_page,fetch_type='js')
- 然后修改detail_page(),设置要保存的数据信息
@config(priority=2) def detail_page(self, response): return { "url": response.url, "title": response.doc('#booktitle').text(), "date":response.doc('.when .data').text(), "day":response.doc('.howlong .data').text(), "who":response.doc('.who .data').text(), "text":response.doc('#b_panel_schedule').text(), "image":response.doc('.cover_img').attr.src, }
- 点击run运行成功后,点击右边save保存项目
- 之后就可以返回pyspider首页,管理项目
- 选择项目运行状态,设置rate/burst【rate表示1s发出多少个请求;burst相当于流控制中令牌桶算法的令牌数;这两个值越大爬取速率越快,也越有可能被封】; progress 四个进度条各时间段状态,蓝色等待执行,绿色成功执行,黄色失败后等待重试,红色失败太多被忽略的任务actions可以运行项目查看结果。
- 我们可以看一下result,右上角可以下载数据
2 pyspider用法详解
- 命令行:
pyspider all / pyspider # 启动
pyspider [OPTIONS] COMMAND [ARGS]
可以指定配置文件访问,pyspider -c pyspider.json all
也可以单独运行一个组件,pyspider scheduler/fetcher/processor [OPTIONS]
更换端口运行 pyspider webui --port 5001 ,也可以写进配置文件中
- crawl方法参数配置:
url 可以是列表也可以是字符串;callback 回调函数解析响应的方法;age 任务的有效时间;priority 优先级越大越优先;exetime 定时任务,时间戳类型;retries 重试次数,默认为3;itag 判定网页是否发生变化的节点值;auto_recrawl 值为true即开启后爬取任务过期后悔重新执行;method HTTP请求方式默认是GET;params 定义get请求参数;data 定义POST表单数据;files 定义上传文件;user_agent;headers;cookies;connect_timeout 初始化最长等待时间,默认20s;timeout 抓取最长等待时间,默认120s;allow_redirects 自动处理重定向,默认True;validate_cert 是否验证证书 对HTTPS有效,默认True;proxy 代理;fetch_type 开启PhantomJS渲染;js_script 页面加载后执行的js脚本;js_run_at js脚本运行位置,默认document-end;js_viewport_width/js_viewport_height js渲染时窗口大小;load_iamges 在加载js页面时是否加载图片,默认否;save 可以在不同方法直接传递参数;cancel 取消任务,如果一个任务是active状态,需要设置force_update为True;force_update 强制更新状态
- 任务区分
pyspider判断两个任务是否重复,对URL的MD5值作为任务的唯一ID。重写task_id()方法可以改变ID计算方式,进行区分如相同URL的post和get
- 全局配置
在crawl_config中进行指定
- 定时爬取
可以在on_start前的every属性设置爬取的时间间隔,24*60代表每天执行一次。index_page上面的age代表过期时间,如果未到过期时间是不会重新执行的。
- 项目状态
TODO 刚创建还没有实现;STOP 停止某项目抓取;CHECKING 正在运行的项目被修改后;DEBUG/RUNNIG 调试/运行;PAUSE 暂停,爬取中多次连续错误,会被自动设置暂停,一段时间后继续爬取;
- 抓取进度
progress 四个进度条各时间段状态,蓝色等待执行,绿色成功执行,黄色失败后等待重试,红色失败太多被忽略的任务。
- 删除项目
pyspider没有删除项目的选项,如果要删除,将项目状态设置为STOP,分组名称设置为delete,24h后自动删除。