使用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求两个list的差集、交集与并集的方法
Nov 01 Python
python线程、进程和协程详解
Jul 19 Python
Python实现matplotlib显示中文的方法详解
Feb 06 Python
python实现简单登陆系统
Oct 18 Python
python random从集合中随机选择元素的方法
Jan 23 Python
VSCode Python开发环境配置的详细步骤
Feb 22 Python
python实现电子产品商店
Feb 26 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
Jan 20 Python
python 利用百度API识别图片文字(多线程版)
Dec 14 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 Python
python状态机transitions库详解
Jun 02 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判断字符以及字符串的包含方法属性
2008/08/30 PHP
简单的PHP缓存设计实现代码
2011/09/30 PHP
PHP自动生成后台导航网址的最佳方法
2013/08/27 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
解决 firefox 不支持 document.all的方法
2007/03/12 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
bootstrap table实例详解
2017/01/06 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
node内置调试方法总结
2018/02/22 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
使用react context 实现vue插槽slot功能
2019/07/18 Javascript
openlayers4实现点动态扩散
2020/08/17 Javascript
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
详解如何在Apache中运行Python WSGI应用
2019/01/02 Python
python字符串循环左移
2019/03/08 Python
Python读取分割压缩TXT文本文件实例
2020/02/14 Python
python爬虫---requests库的用法详解
2020/09/28 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
三个Unix的命令面试题
2015/04/12 面试题
思想政治自我鉴定
2013/10/06 职场文书
招商经理岗位职责
2013/11/16 职场文书
就业意向书
2014/07/29 职场文书
工程索赔意向书
2014/08/30 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书
重温入党誓词主持词
2015/06/29 职场文书
小学副班长竞选稿
2015/11/21 职场文书
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏