分享

pyspider使用实例

 二楼二号 2020-06-08

(注意:实例为爬取起点中文网 >地址:https://www.qidian.com/all)

创建项目:


创建后项目内容:


实例

    操作步骤:

        


数据库内容如下:

        使用mongodb数据库:


代码如下:

  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. # Created on 2018-06-14 17:11:18
  4. # Project: qiushi
  5. from pyspider.libs.base_handler import *
  6. import pymongo, requests
  7. from fake_useragent import UserAgent
  8. import time
  9. def get_proxy():
  10. return requests.get('http://localhost:5010/get/').text
  11.     #由于代理池获取的免费代理,不稳定!因此后面的就不在使用代理,仅仅在这里把获取过程的封装函数放在这里!!
  12. class Handler(BaseHandler):
  13. ua = UserAgent()
  14. headers = {
  15. 'User-Agent': ua.random,
  16. # 'Host':
  17. # 'Referer':
  18. }
  19. # 创建client和db
  20. client = pymongo.MongoClient('localhost')
  21. db = client['qidian']
  22. # 对于整个爬虫项目的全局配置:所有的self.crawl()在请求的时候都会加载这个配置。
  23. crawl_config = {
  24. 'headers': headers,
  25. # 'proxy': get_proxy(),
  26. 'itag': 'v0'
  27. }
  28. # 增量爬虫1:每天重新启动爬虫的时候,只爬取页面上更新的数据。(采用去重策略)
  29. # 增量爬虫2:url没有变化,数据更新了。(不能采用去重,每天都要重新爬取)
  30.      # 项目启动首先进入的函数
  31. # @every: 用于设置定时爬取任务:可以是minutes, 也可以设置为seconds。
  32. @every(seconds=2 * 60)
  33. def on_start(self):
  34. # 初始爬取的url
  35. self.crawl('https://www.qidian.com/all', callback=self.index_page,validate_cert=False)
  36. # age: 主要是对任务url进行去重/过滤(根据taskid),每一个url有唯一的一个标识taskid,age是一个以秒为单位的时间点,
  37.             #如果在这个时间范围内,遇到了相同的taskid,这个任务就会被丢弃。
  38.     @config(age=60)
  39.     def index_page(self, response):
  40. # response.doc返回一个pyquery对象
  41. for each in response.doc('h4 > a').items():
  42.             #fetch_type='js', js_script="":如果是javascript代码,需要在self.crawl()加入该参数
  43.              self.crawl(each.attr.href, callback=self.detail_page, validate_cert=False)
  44. # 找到下一页
  45. # next_page = response.doc('.lbf-pagination-item-list > li:nth-of-type(9) > a')
  46. # self.crawl(next_page.attr.href, callback=self.index_page, validate_cert=False)
  47. # age的默认值是-1,永远不过期。
  48. @config(priority=2,age=60)
  49. def detail_page(self, response):
  50. # 从response中解析详情页的数据
  51. name = response.doc('h1 > em').text()
  52. author = response.doc('h1 a').text()
  53. tag = response.doc('.tag').text()
  54. info = response.doc('.intro').text()
  55. print(time.time())
  56. print(name)
  57. print(author)
  58. print(tag)
  59. print(info)
  60. return {
  61. "time": str(time.time()),
  62. "url": response.url,
  63. "title": response.doc('title').text(),
  64. "name":name,
  65. "author":author,
  66. "tag":tag,
  67. "info":info,
  68. }
  69. # on_result是固定的函数,只要一个函数中有return,就会自动调用这个函数。
  70. def on_result(self, data):
  71. # 将detail_page函数返回的结果,保存至mongodb中
  72. #print('接收到数据了.....',response['url'])
  73. if data == None:
  74. print('空')
  75. else:
  76. if self.db['q'].update_one({'name': data['name']}, {'$set': data}, True):
  77. print('数据保存成功')
  78. else:
  79. print('数据保存失败')
推荐一篇文章pyspider简易教程:网址>https://www.jianshu.com/p/36290e6acf45

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多