使用Scrapy爬取动态数据


Posted in Python onOctober 21, 2018

对于动态数据的爬取,可以选择seleniumPhantomJS两种方式,本文选择的是PhantomJS。

网址:

https://s.taobao.com/search?q=%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306

1.首先第一步,对中间件的设置。

进入pipelines.py文件中:

from selenium import webdriver
from scrapy.http.response.html import HtmlResponse
from scrapy.http.response import Response
class SeleniumSpiderMiddleware(object):
  def __init__(self):
    self.driver = webdriver.PhantomJS()
  def process_request(self ,request ,spider):
    # 当引擎从调度器中取出request进行请求发送下载器之前
    # 会先执行当前的爬虫中间件 ,在中间件里面使用selenium
    # 请求这个request ,拿到动态网站的数据 然后将请求
    # 返回给spider爬虫对象
    if spider.name == 'taobao':
      # 使用爬虫文件的url地址
      spider.driver.get(request.url)
      for x in range(1 ,12 ,2):
        i = float(x) / 11
        # scrollTop 从上往下的滑动距离
        js = 'document.body.scrollTop=document.body.scrollHeight * %f' % i
        spider.driver.execute_script(js)
      response = HtmlResponse(url=request.url,
                  body=spider.driver.page_source,
                  encoding='utf-8',
                  request=request)
      # 这个地方只能返回response对象,当返回了response对象,那么可以直接跳过下载中间件,将response的值传递给引擎,引擎又传递给 spider进行解析
      return response

在设置中,要将middlewares设置打开。

进入settings.py文件中,将

DOWNLOADER_MIDDLEWARES = {
  'taobaoSpider.middlewares.SeleniumSpiderMiddleware': 543,
}

打开。

2.第二步,爬取数据

回到spider爬虫文件中。

引入:

from selenium import webdriver

自定义属性:

def __init__(self):
  self.driver = webdriver.PhantomJS()

查找数据和分析数据:

def parse(self, response):
  div_info = response.xpath('//div[@class="info-cont"]')
  print(div_info)
  for div in div_info:
    title = div.xpath('.//div[@class="title-row "]/a/text()').extract_first('')
    # title = self.driver.find_element_by_class_name("title-row").text
    print('名称:', title)
    price = div.xpath('.//div[@class="sale-row row"]/div/span[2]/strong/text()').extract_first('')

3.第三步,传送数据到item中:

item.py文件中:

name = scrapy.Field()
price = scrapy.Field()

回到spider.py爬虫文件中:

引入:

from ..items import TaobaospiderItem

传送数据:

#创建实例化对象。

item = TaobaospiderItem()
item['name'] = title
item['price'] = price
yield item

在设置中,打开:

ITEM_PIPELINES = {
  'taobaoSpider.pipelines.TaobaospiderPipeline': 300,
}

4.第四步,写入数据库:

进入管道文件中。

引入

import sqlite3
写入数据库的代码如下:
class TaobaospiderPipeline(object):
  def __init__(self):
    self.connect = sqlite3.connect('taobaoDB')
    self.cursor = self.connect.cursor()
    self.cursor.execute('create table if not exists taobaoTable (name text,price text)')
  def process_item(self, item, spider):
    self.cursor.execute('insert into taobaoTable (name,price)VALUES ("{}","{}")'.format(item['name'],item['price']))
    self.connect.commit()
    return item
  def close_spider(self):
    self.cursor.close()
    self.connect.close()

在设置中打开:

ITEM_PIPELINES = {
  'taobaoSpider.pipelines.TaobaospiderPipeline': 300,
}

因为在上一步,我们已经将管道传送设置打开,所以这一步可以不用重复操作。

然后运行程序,打开数据库查看数据。

使用Scrapy爬取动态数据

至此,程序结束。

下附spider爬虫文件所有代码:

# -*- coding: utf-8 -*-
import scrapy
from selenium import webdriver
from ..items import TaobaospiderItem
class TaobaoSpider(scrapy.Spider):
  name = 'taobao'
  allowed_domains = ['taobao.com']
  start_urls = ['https://s.taobao.com/search?q=%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306']
  def __init__(self):
    self.driver = webdriver.PhantomJS()
  def parse(self, response):
    div_info = response.xpath('//div[@class="info-cont"]')
    print(div_info)
    for div in div_info:
      title = div.xpath('.//div[@class="title-row "]/a/text()').extract_first('')
      print('名称:', title)
      price = div.xpath('.//div[@class="sale-row row"]/div/span[2]/strong/text()').extract_first('')
      item = TaobaospiderItem()
      item['name'] = title
      item['price'] = price
      yield item
  def close(self,reason):
    print('结束了',reason)
    self.driver.quit()

关于scrapy的中文文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/faq.html

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
Python中的异常处理学习笔记
Jan 28 Python
python的else子句使用指南
Feb 27 Python
Python基于pillow判断图片完整性的方法
Sep 18 Python
numpy给array增加维度np.newaxis的实例
Nov 01 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
Apr 23 Python
django认证系统 Authentication使用详解
Jul 22 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
Aug 09 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
Aug 09 Python
python3实现单目标粒子群算法
Nov 14 Python
使用python快速在局域网内搭建http传输文件服务的方法
Nov 14 Python
Python celery原理及运行流程解析
Jun 13 Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 Python
python使用正则表达式来获取文件名的前缀方法
Oct 21 #Python
python遍历文件夹找出文件夹后缀为py的文件方法
Oct 21 #Python
python os.listdir按文件存取时间顺序列出目录的实例
Oct 21 #Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
Oct 21 #Python
Python3中关于cookie的创建与保存
Oct 21 #Python
Python3中在Anaconda环境下安装basemap包
Oct 21 #Python
解决安装python库时windows error5 报错的问题
Oct 21 #Python
You might like
DOMXML函数笔记
2006/10/09 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
JavaScript的变量作用域深入理解
2009/10/25 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
JavaScript之RegExp_动力节点Java学院整理
2017/06/29 Javascript
详解Node.js读写中文内容文件操作
2018/10/10 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
[05:02]2014DOTA2 TI中国区预选赛精彩TOPPLAY第三弹
2014/06/25 DOTA
python Django批量导入数据
2016/03/25 Python
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
Python解析多帧dicom数据详解
2020/01/13 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
Java编程面试题
2016/04/04 面试题
护士自荐信范文
2013/12/15 职场文书
单位办理社保介绍信
2014/01/10 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
女生抽烟检讨书
2014/10/05 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
python实现Thrift服务端的方法
2021/04/20 Python
HTML基本元素标签介绍
2022/02/28 HTML / CSS