使用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程序员开发中常犯的10个错误
Jul 07 Python
python使用marshal模块序列化实例
Sep 25 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
基于hashlib模块--加密(详解)
Jun 21 Python
Python实现按特定格式对文件进行读写的方法示例
Nov 30 Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 Python
Django的Modelforms用法简介
Jul 27 Python
python 实现让字典的value 成为列表
Dec 16 Python
python实现吃苹果小游戏
Mar 21 Python
Pandas之read_csv()读取文件跳过报错行的解决
Apr 21 Python
Python 发送邮件方法总结
Aug 10 Python
详解Python中的for循环
Apr 30 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
教你如何把一篇文章按要求分段
2006/10/09 PHP
ajax php 实现写入数据库
2009/09/02 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
JS的数组迭代方法
2015/02/05 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
JavaScript中的slice()方法使用详解
2015/06/06 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
js实现延迟加载的几种方法
2017/04/24 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
VUE长按事件需求详解
2017/10/18 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
vue-video-player 断点续播的实现
2021/02/01 Vue.js
Python合并多个装饰器小技巧
2015/04/28 Python
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
Python文件如何引入?详解引入Python文件步骤
2018/12/10 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
在python里使用await关键字来等另外一个协程的实例
2020/05/04 Python
师范应届生语文教师求职信
2013/10/29 职场文书
商铺消防安全责任书
2014/07/29 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
惊天动地观后感
2015/06/10 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
MySQL中日期型单行函数代码详解
2021/06/21 MySQL
golang 实用库gotable的具体使用
2021/07/01 Golang
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android