使用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的bottle框架跨域请求报错问题的处理方法
Mar 19 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
python+POP3实现批量下载邮件附件
Jun 19 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
Sep 04 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
python flask搭建web应用教程
Nov 19 Python
Python logging模块写入中文出现乱码
May 21 Python
Python 分布式缓存之Reids数据类型操作详解
Jun 24 Python
用python实现一个简单的验证码
Dec 09 Python
pyspark对Mysql数据库进行读写的实现
Dec 30 Python
Python3.9.1中使用split()的处理方法(推荐)
Feb 07 Python
python读取excel数据并且画图的实现示例
Feb 08 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 5.5 创建和验证哈希最简单的方法详解
2013/11/07 PHP
Javascript UrlDecode函数代码
2010/01/09 Javascript
javascript 正则替换 replace(regExp, function)用法
2010/05/22 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
js实现表单Radio切换效果的方法
2015/08/17 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
简单的js计算器实现
2016/10/26 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
2017/05/11 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
小程序使用分包的示例代码
2020/03/23 Javascript
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
通过shell+python实现企业微信预警
2019/03/07 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
python爬虫可以爬什么
2020/06/16 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
django跳转页面传参的实现
2020/09/17 Python
5 分钟读懂Python 中的 Hook 钩子函数
2020/12/09 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
应届生会计求职信
2013/11/11 职场文书
清洁工表扬信
2014/01/08 职场文书
内勤主管岗位职责
2014/04/03 职场文书
入职担保书怎么写
2014/05/12 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫