文章目录

  • 1、**scrapy对接selenium**
  • 2、pipeline数据持久化

1、scrapy对接selenium

动态数据加载:
1.ajax:
①url接口存在规律, 可以自行构建url, 直接爬取
②selenium自动化测试框架, 抓取动态数据
2.js动态数据加载
①js逆向
②selenium抓取

selenium可以实现抓取动态数据
scrapy不能抓取动态数据, 如果是ajax请求, 可以请求接口, 如果是js动态加载, 需要结合selenium

import scrapy
from selenium import webdriver
from ..items import WynewsItem
from selenium.webdriver import ChromeOptionsclass NewsSpider(scrapy.Spider):name = 'news'# allowed_domains = ['www.baidu.com']start_urls = ['https://news.163.com/domestic/']option.add_experimental_option('excludeSwitches', ['enable-automation'])                                                                          bro=webdriver.Chrome(executable_path=r'C:\Users\Administrator\Desktop\news\wynews\wynews\spiders\chromedriver.exe')def detail_parse(self, response):content_list = response.xpath('//div[@id="endText"]/p//text()').extract()content = ''title = response.meta['title']for s in content_list:content += sitem = WynewsItem()item["title"] = titleitem["content"] = contentyield itemdef parse(self, response):div_list = response.xpath('//div[contains(@class, "data_row")]')for div in div_list:link = div.xpath('./a/@href').extract_first()title = div.xpath('./div/div[1]/h3/a/text()').extract_first()yield scrapy.Request(url=link, callback=self.detail_parse, meta={"title":title})
# 中间件编码:
from scrapy.http import HtmlResponse
class WynewsDownloaderMiddleware(object):def process_response(self, request, response, spider):bro = spider.broif request.url in spider.start_urls:bro.get(request.url)time.sleep(3)js = 'window.scrollTo(0, document.body.scrollHeight)'bro.execute_script(js)time.sleep(3)response_selenium = bro.page_sourcereturn HtmlResponse(url=bro.current_url, body=response_selenium, encoding="utf-8", request=request)return response
# Pipeline编码:
import pymongoclass WynewsPipeline(object):conn = pymongo.MongoClient('localhost', 27017)db = conn.wynewstable = db.newsinfodef process_item(self, item, spider):self.table.insert(dict(item))return item

2、pipeline数据持久化

介绍:
1.pipelines: 用于数据持久化
2.数据持久化的方式有很多种: MongoDB, MySQL, Redis, CSV
3.必须实现的方法: process_item

# 核心方法讲解:
open_spider(self, spider): spider开启是被调用
close_spider(self, spider): spider关闭是被调用
from_crawler(cls, crawler): 类方法, 用@classmethod标识, 可以获取配置信息
Process_item(self, item, spider): 与数据库交互存储数据, 该方法必须实现 *****
# 重点: 所有的方法名都必须一致
# MongoDB交互:
import Pymongo
# 管道类
class MongoPipeline(object):# 初始化方法, __new__: 构造方法, 在内存中开辟一块空间def __init__(self, mongo_uri, mongo_db):self.mongo_uri = mongo_uriself.mongo_db = mongo_db@classmethoddef from_crawler(cls, crawler):return cls(mongo_uri = crawler.settings.get('MONGO_URI'),mongo_db = crawler.settings.get('MONGO_DB'))def open_spider(self, spider):self.client = pymongo.MongoClient(self.mongo_uri)self.db = self.client[self.mongo_db]def process_item(self, item, spider):self.db['news'].insert(dict(item))# 在一个项目中可能存在多个管道类, 如果该管道类后面还有管道类需要存储数据, 必须return itemreturn itemdef close_spider(self, spider):self.client.close()
# MySQL交互:
import pymysqlclass MysqlPipeline(object):def __init__(self, host, database, user, password, port):self.host = hostself.database = databaseself.user = userself.password = passwordself.port = port@classmethod  def from_crawler(cls, crawler):return cls(host = crawler.settings.get('MYSQL_HOST')database = crawler.settings.get('MYSQL_DATABASE')user = crawler.settings.get('MYSQL_USER')password= crawler.settings.get('MYSQL_PASSWORD')port = crawler.settings.get('MYSQL_PORT'))def open_spider(self, spider):self.db = pymysql.connect(self.host, self.user, self.password, self.database, charset='utf-8', port=self.port)self.cursor = self.db.cursor()def process_item(self, item, spider):data = dict(item)keys = ','.join(data.keys())values = ','.join(['%s']*len(data))sql = 'insert into %s (%s) values (%s)' % (tablename, keys, values)self.cursor.execute(sql, tuple(data.values()))self.db.commit()return item

用于文件下载的管道类

# spider编码:
import scrapy
from ..items import XhxhItem
class XhSpider(scrapy.Spider):name = 'xh'# allowed_domains = ['www.baidu.com']start_urls = ['http://www.521609.com/qingchunmeinv/']def parse(self, response):li_list = response.xpath('//div[@class="index_img list_center"]/ul/li')for li in li_list:item = XhxhItem()link = li.xpath('./a[1]/img/@src').extract_first()item['img_link'] = 'http://www.521609.com' + linkprint(item)yield item
# items编码:
import scrapy
class XhxhItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()img_link = scrapy.Field()
# 管道编码:
import scrapy
from scrapy.pipelines.images import ImagesPipelineclass XhxhPipeline(object):def process_item(self, item, spider):return itemclass ImgPipeLine(ImagesPipeline):def get_media_requests(self, item, info):yield scrapy.Request(url=item['img_link'])def file_path(self, request, response=None, info=None):url = request.urlfile_name = url.split('/')[-1]return file_namedef item_completed(self, results, item, info):return item
# settings编码:
ITEM_PIPELINES = {'xhxh.pipelines.XhxhPipeline': 300,'xhxh.pipelines.ImgPipeLine': 301,
}
IMAGES_STORE = './mvs'

scrapy框架对接seleniumpipeline数据持久化相关推荐

  1. Scrapy框架爬取数据

    因为对爬虫有着很大的好奇心,所以又找了一些资料继续开始了学习之旅. 文章目录 一.Scrapy框架简介 二.爬取网络数据 2.1爬取单个网页数据 2.2爬取多个网页数据 三.一些小方法 四.小结 一. ...

  2. Python3网络爬虫之Scrapy框架实现招聘数据抓取

    项目需求: 某招聘网上面有公司发布的的各种工作岗位,进入首页 https://careers.tencent.com/ 后可见 到一个搜索框,如下图所示: 在搜索框输入岗位名称,跳转到如下图所示页面, ...

  3. android数据持久化框架,Android:数据持久化、Environment、SharedPreferences、内部存储internalStorage...

    1.数据持久化-SDCard//数据持久化-SDCard findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @ ...

  4. Scrapy爬虫框架(实战篇)【Scrapy框架对接Splash抓取javaScript动态渲染页面】

    (1).前言 动态页面:HTML文档中的部分是由客户端运行JS脚本生成的,即服务器生成部分HTML文档内容,其余的再由客户端生成 静态页面:整个HTML文档是在服务器端生成的,即服务器生成好了,再发送 ...

  5. python爬虫十二:初步使用Scrapy框架爬取数据

    1.通过pipelines操作拿到的数据 要点一:爬虫文件必须通过关键字yield生成器才能与pipelines建立链接才可以操作,当运行爬虫文件之后执行的顺序如下图简介,如果重写模块或者内部方法可能 ...

  6. scrapy框架之全站数据的爬取

    全站数据的爬取有俩种方式: 1.基于spider的全站数据爬取:需要自己进行分页操作,并进行手动发送请求 2.基于CrawlSpider ,今天主要讲解基于CrawlSpider 的爬取方式 Craw ...

  7. python爬虫库scrapy_使用Python爬虫Scrapy框架爬取数据

    时隔数月,国庆期间想做个假期旅游的分析展示. 1.通过Python爬取旅游网站上数据,并存储到数据库 2.通过Echart/FineReport/Superset等数据分析工具对数据展示 环境: Wi ...

  8. 【python爬虫】scrapy框架案例实现数据保存入MySQL

    文章目录

  9. Python Scrapy 爬虫框架爬取推特信息及数据持久化!整理了我三天!

    最近要做一个国内外新冠疫情的热点信息的收集系统,所以,需要爬取推特上的一些数据,然后做数据分类及情绪分析.作为一名合格的程序员,我们要有「拿来主义精神」,借助别人的轮子来实现自己的项目,而不是从头搭建 ...

最新文章

  1. nyoj_518_取球游戏_201404161738
  2. 异构服务器 微服务_Spring Cloud Alibaba Sidecar 多语言微服务异构
  3. 《零基础看得懂的C语言入门教程 》——(三)轻轻松松理解第一个C语言程序
  4. C语言之变量存储类型与链接属性
  5. 马云:梭梭树就是企业家精神
  6. IPMI从驱动到应用(下篇 )
  7. 如何使用MacClean在Mac上释放磁盘空间?
  8. CSS中怎么让DIV水平居中
  9. Mysql查询某列最长字符串记录
  10. win10同步服务器文件夹,和彩云如何设置同步文件夹?
  11. Android 特效直播实现原理解析
  12. ## STAMP使用中数据上传注意事项
  13. linux系统属于操作系统吗,linux属于什么操作系统
  14. 【看表情包学Linux】Redirect 重定向 | 时间相关指令 | 文件查找 | 打包与压缩
  15. Teranex AV标准转换器
  16. 安卓多渠道打包(三)360加固多渠道打包
  17. 盒马鲜生真的是新零售吗?
  18. 加密市场中的14个心智模型
  19. 移动通信第六章,多址技术
  20. Java单体应用 - 架构模式 - 03.设计模式-10.装饰器模式

热门文章

  1. 数据中心节水管理办法(范例)
  2. 无人数据中心何时到来仍需等待
  3. mfc 消息消息队列概念_必看入门秘籍——解密原理:消息中间件之RabbitMQ
  4. 深度复制_最新深度调研,券商是大行情!有可能复制历次牛市行情!!!
  5. DayDayUp:大学英语六级考试历年真题答案规律分析、应试回答精讲、及六级改革历史之详细攻略
  6. ML之DT:机器学习根据大量数据,已知年龄、收入、是否上海人、私家车价格的一个人,预测是否有真实购买上海黄浦区楼房的能力
  7. DL之LeNet-5:LeNet-5算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  8. MAT之PSO:利用PSO+ω参数实现对一元函数y = sin(10*pi*x) ./ x进行求解优化,找到最优个体适应度
  9. Sklearn中的CV与KFold详解
  10. OpenCV官方文档 理解k - means聚类