#化鲲为鹏,我有话说# 鲲鹏弹性云服务器运行网络爬虫(下)分页与总结

举报
golang 发表于 2019/11/24 03:57:03 2019/11/24
【摘要】 ## 一 分页通过之前的方法,用选择器点击图标,右侧代码框会自动定位该元素,这里可以看到通过 /page/2/ 以末尾的数字进行分页获取该链接, 然后递归调用自己一直查询```bashnext = response.doc('.next a').attr.hrefself.crawl(next, callback=self.index_page)```![](http://q08lachnw...

#化鲲为鹏,我有话说# 鲲鹏弹性云服务器运行网络爬虫(下)分页与总结


一 分页


通过之前的方法,用选择器点击图标,右侧代码框会自动定位该元素,这里可以看到通过 /page/2/ 以末尾的数字进行分页

通过 response.doc()获取标签,`attr.href获取该链接, 然后递归调用爬虫方法

next = response.doc('.next a').attr.href
self.crawl(next, callback=self.index_page)


20191115125827.png



二 源码

以下是完全的源码及详细功能注释

itag 当任务状态是 successfailed 时。

注解 @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


20191124034849.png

20191112184653.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。