scrapy+selenium 爬取淘宝商城商品数据存入到mongo中

1.配置信息

# 设置mongo参数
MONGO_URI = ‘localhost‘
MONGO_DB = ‘taobao‘

# 设置搜索关键字
KEYWORDS=[‘小米手机‘,‘华为手机‘]
# 最大爬取页数
MAX_PAGE = 2
# 相应超时设置
SELENIUM_TIMEOUT = 20

ROBOTSTXT_OBEY = False #忽略

# 中间件
DOWNLOADER_MIDDLEWARES = {
   ‘taobaoSpider.middlewares.SeleniumMiddleware‘: 300,
}

#项目管道
ITEM_PIPELINES = {
   # ‘taobaoSpider.pipelines.TaobaospiderPipeline‘: 300,
    ‘taobaoSpider.pipelines.MongoPipeline‘: 400,
}
2.item
import scrapy

class TaobaospiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    price = scrapy.Field()
    sales = scrapy.Field()
    shop = scrapy.Field()
    location = scrapy.Field()
    image = scrapy.Field()

3.spider

# -*- coding: utf-8 -*-
import scrapy

class TaobaoSpider(scrapy.Spider):
    name = ‘taobao‘
    allowed_domains = [‘taobao.com‘]
    base_url = ‘https://s.taobao.com/search?q=‘

    def start_url(self):
        # 通过self.settings.get()的方式获取setting里面的参数
        for keyword in self.gettings.get(‘KEYWORDS‘):
            for page in range(1,self.gettings.get(‘MAX_PAGE‘)+1):
                url = self.base_url.format(self.url)
                yield scrapy.Request(url=self.url,
                                     callback=self.parse,
                                    meta={‘page‘:page}, # 传递页码
                                    dont_filter=True) # 不去重

    def parse(self, response):

        products = response.xpath(‘//*[@id="mainsrp-itemlist"]/div[@class="m-itemlist"]/div[@class="grid g-claerfix"]/div[1]‘)

        # products = response.xpath(‘//div[contains(@class,"item J_MouserOnverReq"/‘)
        for product in products:
            from taobaoSpider.taobaoSpider.items import TaobaospiderItem
            item = TaobaospiderItem()
            item[‘title‘] = ‘‘.join(product.xpath(‘//div[contains(@class,"title")]/text()‘).extract()).strip()
            item[‘location‘] = ‘‘.join(product.xpath(‘//div[contains(@class,"location")]/text()‘).extract()).strip()
            item[‘shop‘] = ‘‘.join(product.xpath(‘//div[contains(@class,"shop")]/text()‘).extract()).strip()
            item[‘price‘] = ‘‘.join(product.xpath(‘//div[contains(@class,"price")]/text()‘).extract()).strip()
            item[‘deal‘] = ‘‘.join(product.xpath(‘//div[contains(@class,"deal-cnt")]/text()‘).extract()).strip()
            item[‘iamge‘] = ‘‘.join(product.xpath(‘//div[@class="pic"]/img[contains(@class,"img")/@data-src‘).extract()).strip()
            yield item

4.中间件

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from scrapy.http import HtmlResponse
from logging import getLogger

class SeleniumMiddleware(object):
    # def __init__(self, timeout=None, service_args=[]):
    def __init__(self, timeout=None):
        self.logger = getLogger(__name__)
        self.timeout = timeout
        # self.browser = webdriver.PhantomJS(service_args=service_args)
        # 无界面模式
        # self.options = webdriver.ChromeOptions()
        # self.options.add_argument(‘--headless‘)
        # self.browser = webdriver.Chrome(chrome_options=self.options)
        self.browser = webdriver.Chrome()
        # self.browser.set_window_size(1400, 700)
        self.browser.set_page_load_timeout(self.timeout)
        self.wait = WebDriverWait(self.browser, self.timeout)
        print(‘timeout:‘, self.timeout)

    def __del__(self):
        self.browser.close()

    def process_request(self, request, spider):
        ‘‘‘
        :param request:
        :param spider:
        :return:
        ‘‘‘
        self.logger.debug(‘Selenium is Runing‘)
        # 得到的是个int型的整数
        page = request.meta.get(‘page‘, 1)
        try:
            self.browser.get(request.url)
            print(10*‘-‘, request.url,10*‘-‘)
            if page > 1:
                # 从第二页开始,等待页面加载完成
                # Presence_of_all_elements_located 判断一组元素是否存在
                input = self.wait.until(
                    EC.presence_of_element_located((By.CSS_SELECTOR, ‘##mainsrp-pager > div > div > div > div.form > input‘)))
                # Element_to_be_clickable 判断元素是否可点击
                submit = self.wait.until(
                    EC.element_to_be_clickable((By.CSS_SELECTOR, ‘#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit‘)))
                input.clear()
                # 输入第几页
                input.send_keys(page)
                submit.click()
            # Text_to_be_present_in_element 判断元素是否有xx文本信息
            self.wait.until(EC.text_to_be_present_in_element((
                By.CSS_SELECTOR, ‘#mainsrp-pager > div > div > div > ul > li.item.active > span‘), str(page)))
            # Presence_of_all_elements_located 判断一组元素是否存在
            # 检测每一个item是否加载出来了
            self.wait.until(EC.presence_of_element_located((
                By.CSS_SELECTOR, ‘#mainsrp-itemlist .m-itemlist .grid.g-clearfix .item‘)))
            return HtmlResponse(url=request.url, body=self.browser.page_source, request=request, encoding=‘utf-8‘, status=200)
        except TimeoutException:
            return HtmlResponse(url=request.url, status=500, request=request)

    # 类方法 感觉就是获取setting里面的数据 在这里调用
    # 得到数据之后变成类变量
    @classmethod
    def from_crawler(cls, crawler):
        return cls(timeout=crawler.settings.get(‘SELENIUM_TIMEOUT‘),)
                   # service_args=crawler.settings.get(‘PHANTOMJS_SERVICE_ARGS‘))

5.管道(存储到mongo中)

class Pipeline(object):
    def process_item(self, item, spider):
        return item

import pymongo

# 存储到mongo中
class MongoPipeline(object):

    # 配置mongo数据库
    def __init__(self,mongo_url,mongo_db):
        self.mongo_url = mongo_url
        self.mongo_db = mongo_db

    # 从setting中获取参数
    @classmethod
    def from_crawler(cls,crawler):
        mongo_url = crawler.settings.get(‘MONGO_URL‘)
        mongo_db = crawler.settings.get(‘MONGO_DB‘)

    # 连接数据库
    def open_spider(self,spider):
        self.client = pymongo.MongoClient(self.mongo_url)
        self.db = self.client[self.mongo_db]

    # 关闭数据库连接
    def close_spider(self,spider):
        self.client.close()

    # 设置存储格式
    def process_item(self,item,spider):
        # item.__class__.__name__  输出的item的类名
        name = item.__class__.__name__
        print(‘---------------name‘, name, ‘-------------------‘)
        self.db[name].insert(dict(item))
        return item

原文地址:https://www.cnblogs.com/ray-mmss/p/9388390.html

时间: 2024-10-28 20:03:37

scrapy+selenium 爬取淘宝商城商品数据存入到mongo中的相关文章

scrapy+selenium 爬取淘宝

# -*- coding: utf-8 -*- import scrapy from scrapy import Request from urllib.parse import quote from ..items import ScrapyseleniumtestItem class TaobaoSpider(scrapy.Spider): name = 'tao_bao' allowed_domains = ['www.taobao.com'] base_url = 'https://s.

利用Selenium爬取淘宝商品信息

一.  Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样.由于这个性质,Selenium也是一个强大的网络数据采集工具,其可以让浏览器自动加载页面,这样,使用了异步加载技术的网页,也可获取其需要的数据. Selenium模块是Python的第三方库,可以通过pip进行安装: pip3 install selenium Selenium自己不带浏览器,需要配合第三方浏览器来使用.通过help命

爬虫实例之selenium爬取淘宝美食

这次的实例是使用selenium爬取淘宝美食关键字下的商品信息,然后存储到MongoDB. 首先我们需要声明一个browser用来操作,我的是chrome.这里的wait是在后面的判断元素是否出现时使用,第二个参数为等待最长时间,超过该值则抛出异常. browser = webdriver.Chrome() wait = WebDriverWait(browser,10) 声明好之后就需要进行打开网页.进行搜索的操作. #使用webdriver打开chrome,打开淘宝页面,搜索美食关键字,返回

用selenium爬取淘宝美食

'''利用selenium爬取淘宝美食网页内容''' import re from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.su

爬取京东本周热卖商品基本信息存入MySQL

爬取京东本周热卖商品基本信息存入MySQL 网络爬虫介绍 概述 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. 产生背景 随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战.搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人

使用Selenium爬取淘宝商品

import pymongo from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait im

Selenium爬取淘宝商品概要入mongodb

准备: 1.安装Selenium:终端输入 pip install selenium 2.安装下载Chromedriver:解压后放在…\Google\Chrome\Application\:如果是Mac,可放入/usr/locl/bin,并将此目录放入环境变量 3.安装pyquery:终端输入 pip install pyquery 4.安装pymongo:终端输入 pip install pymongo 5.安装MongoDB的PyCharm插件:Preferences——Plugins——

scrapy结合selenium爬取淘宝等动态网站

1.首先创建爬虫项目 2.进入爬虫 class TaobaoSpider(scrapy.Spider): name = 'taobao' allowed_domains = ['taobao.com'] #拿一个笔记本键盘做示例 start_urls = ['https://s.taobao.com/search?initiative_id=tbindexz_20170306&ie=utf8&spm=a21bo.2017.201856-taobao-item.2&sourceId=

jQuery制作淘宝商城商品列表多条件查询功能

一.介绍 这几天做网站的时候,突然用到这个功能,找了好久也没有找到.看到"希伟素材网"有这么一个JS,效果很不错,也正是我一直以来想要的结果.附图如下: 二:使用教程      1.HTML代码: <ul class="select"> <li class="select-list"> <dl id="select1"> <dt>上装:</dt> <dd cla