#化鲲为鹏,我有话说# 鲲鹏弹性云服务器运行网络爬虫(下)分页与总结
#化鲲为鹏,我有话说# 鲲鹏弹性云服务器运行网络爬虫(下)分页与总结
一 分页
通过之前的方法,用选择器点击图标,右侧代码框会自动定位该元素,这里可以看到通过 /page/2/
以末尾的数字进行分页
通过 response.doc()
获取标签,`attr.href
获取该链接, 然后递归调用爬虫方法
next = response.doc('.next a').attr.href
self.crawl(next, callback=self.index_page)
二 源码
以下是完全的源码及详细功能注释
itag
当任务状态是 success
或 failed
时。
注解 @config
设置的参数 age
会检测 上次抓取时间 + age
是否大于当前时间,若大于,则会重启任务。
或者,通过设置 itag
参数,当本次请求的 itag
与上次不同时,会重启任务。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2019-11-24 03:27:43
# Project: demo1
from pyspider.libs.base_handler import *
import pymongo
class Handler(BaseHandler):
crawl_config = {
# 见上面描述
'itag': 'v224'
}
# 连接 mongodb 数据库
client = pymongo.MongoClient('localhost')
# 库名为 trip
db = client['demo1']
@every(minutes=24 * 60)
def on_start(self):
self.crawl('http://quotes.toscrape.com/', callback=self.index_page)
@config(age=60)
def index_page(self, response):
# 爬取详情信息
self.crawl(response.url, callback=self.detail_page)
# 获取下一页
next = response.doc('.next a').attr.href
# 递归调用
self.crawl(next, callback=self.index_page)
@config(priority=2)
def detail_page(self, response):
results = []
# 页面内的所有名言块
for each in response.doc('.quote').items():
# 名言
comment = each.find('[itemprop="text"]').text()
# 作者
author = each.find('[itemprop="author"]').text()
# 标签元素
tags = each.find('.tags .tag').items()
# 将标签元素的 text 属性封装到列表
tagList = []
for tag in tags:
tagList.append(tag.text())
# 将本页名言封装到结果集
results.append({
"comment": comment,
"author": author,
"tagList": tagList
})
return results
# 如果有数据,则调用存储数据库方法
def on_result(self,result):
if result:
self.save_to_mongo(result)
# 存到 MongoDB 数据库
def save_to_mongo(self,result):
if self.db['comment'].insert(result):
print('saved to mongo',result)
三 常用方法
auto_recrawl
在任务过期后,自动重爬取
method
请求方法,默认 get 请求
params
追加参数 url, 感觉不常用
data
用于提交 post 请求的数据,可以用于登录?
connect_timeout
连接的超时时间,默认20秒
timeout
超时的请求时间,默认120秒
validate_cert
针对 https 网站,会爆证书错误,设置 false 可以忽略并继续访问,默认true
proxy
代理
etag
布尔类型变量,默认 true, 判断是否发生变化,没有发生变化就不爬了
fetch_type
请求的原始的 docment, 设置 =js 后,就可以调用 js 进行渲染
fetch_type='js'
js_script
可以执行js 操作, 比如滚动到网页的最下端,触发更多加载
window.scrollTo(0,document.body.scrollHeight);
js_run_at
将脚本加入到前面或者后面执行,默认是后面
js_viewport_width/js_viewport_height
视窗的大小
load_images
是否加载图片,默认 false
save
做多个函数之间传递变量,相当于 response 的session
taskid
唯一标识码,去重
四 web 浏览框
使用的时候发现这个浏览框非常的小, 改变方法见下图2
此方法只能用于本次, 一劳永逸需要修改配置文件
该路径是指向 pyspider 文件夹
sudo vim /usr/local/lib/python3.5/dist-packages/pyspider/webui/static/debug.min.css
增加 iframe 的样式: height:900px !important
- 点赞
- 收藏
- 关注作者
评论(0)