使用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搭建微信公众平台
Feb 09 Python
深入理解python中的闭包和装饰器
Jun 12 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 Python
PyCharm代码格式调整方法
May 23 Python
python pandas实现excel转为html格式的方法
Oct 23 Python
python 实现调用子文件下的模块方法
Dec 07 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
Dec 31 Python
python统计文章中单词出现次数实例
Feb 27 Python
浅析python标准库中的glob
Mar 13 Python
解决pip install psycopg2出错问题
Jul 09 Python
python如何支持并发方法详解
Jul 25 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
Apr 28 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
php编写一个简单的路由类
2011/04/13 PHP
php 归并排序 数组交集
2011/05/10 PHP
php中通过虚代理实现延迟加载的实现代码
2011/06/10 PHP
深入理解PHP中的Session和Cookie
2013/06/21 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
2013/11/27 PHP
一个原生的用户等级的进度条
2010/07/03 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
JavaScript实现256色转灰度图
2017/02/22 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
vue+axios 前端实现的常用拦截的代码示例
2018/08/23 Javascript
vue实现移动端省市区选择
2019/09/27 Javascript
python抓取网页图片示例(python爬虫)
2014/04/27 Python
python的dict,set,list,tuple应用详解
2014/07/24 Python
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
Python 实现一个计时器
2020/07/28 Python
纯css3实现效果超级炫的checkbox复选框和radio单选框
2014/09/01 HTML / CSS
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
生物科学系大学生的自我评价
2013/12/20 职场文书
打架检讨书300字
2014/02/02 职场文书
入党自荐书范文
2014/03/09 职场文书
农业生产宣传标语
2014/10/08 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
整改通知书格式
2015/04/22 职场文书
总经理年会致辞
2015/07/29 职场文书
利用Python实时获取steam特惠游戏数据
2022/06/25 Python