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
scrapy+selenium 爬取淘宝商城商品数据存入到mongo中的更多相关文章
- 使用scrapy+selenium爬取淘宝网
--***2019-3-27测试有效***---- 第一步: 打开cmd,输入scrapy startproject taobao_s新建一个项目. 接着cd 进入我们的项目文件夹内输入scrapy ...
- 爬取淘宝商品数据并保存在excel中
1.re实现 import requests from requests.exceptions import RequestException import re,json import xlwt,x ...
- 利用Selenium爬取淘宝商品信息
一. Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样.由于这个性质,Selenium也是一 ...
- Scrapy+selenium爬取简书全站
Scrapy+selenium爬取简书全站 环境 Ubuntu 18.04 Python 3.8 Scrapy 2.1 爬取内容 文字标题 作者 作者头像 发布日期 内容 文章连接 文章ID 思路 分 ...
- python3编写网络爬虫16-使用selenium 爬取淘宝商品信息
一.使用selenium 模拟浏览器操作爬取淘宝商品信息 之前我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过A ...
- 使用Selenium爬取淘宝商品
import pymongo from selenium import webdriver from selenium.common.exceptions import TimeoutExceptio ...
- 爬虫实战4:用selenium爬取淘宝美食
方案1:一次性爬取全部淘宝美食信息 1. spider.py文件如下 __author__ = 'Administrator' from selenium import webdriver from ...
- 使用selenium抓取淘宝的商品信息
淘宝的页面大量使用了js加载数据,所以采用selenium来进行爬取更为简单,selenum作为一个测试工具,主要配合无窗口浏览器phantomjs来使用. import re from seleni ...
- 吴裕雄--天生自然PYTHON爬虫:使用Selenium爬取大型电商网站数据
用python爬取动态网页时,普通的requests,urllib2无法实现.例如有些网站点击下一页时,会加载新的内容,但是网页的URL却没有改变(没有传入页码相关的参数),requests.urll ...
随机推荐
- powerDesigner的建表语句默认设置为去掉双引号
powerDesigner的建表语句默认设置为去掉双引号,依次执行如下操作: Database ------>> Edit Current DBMS ------>> Scri ...
- APM之原理篇
APM,应用性能监控,有new relic等产品,对APM感兴趣的应该不会不知道它了.主要功能就是统计分析应用的CPU.内存.网络.数据库.UI等性能,并提供错误日志捕获.编码人员需要做的仅仅是使用它 ...
- (十三)springMvc 处理 Json
目录 文章目录 为什么用 Json 处理 json 的流程 环境准备 配置 json 转换器 后记 更新 为什么用 Json Json 格式简单,语法简单,解析简单 : 处理 json 的流程 判断客 ...
- EffectiveC++
宁可以编译器替换预处理器 define 不被视为语言的一部分,因此也就有可能在预处理阶段被优化掉,导致相关变量出现错误. #define ASPECT_RATIO 1.63 //可以尝试将其替换为 c ...
- 【Python基础】09_Python中的元组
1.元组的定义 Tuple (元组)与列表类似,元组的元素 不能修改 元组通常保存 不同类型 的数据 元组用()定义 info_tuple = ("张三", 18, 1.75) 定 ...
- MongoDB环境搭建
MongoDB系列第一课:MongDB简介 MongoDB系列第二课:MongDB环境搭建 MongoDB系列第三课:MongDB用户管理 MongoDB系列第四课:MongoDB数据库.集合.文档的 ...
- Wannafly挑战赛2D Delete (最短路好题)
大意: 给定DAG, 给定点$S,T$, 每次询问给出点$x$, 求删除$x$后的$S->T$的最短路, 询问之间独立. 删除点$x$的最短路一定要经过一条边$(u,v)$, 满足$u$拓扑序在 ...
- C++反汇编第二讲,反汇编中识别虚表指针,以及指向的虚函数地址
讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好的,这里我扣过来了,当然也可以看原博客链接: http://blog.csdn.net ...
- Rikka with Graph hdu 6090
题解:考虑贪心地一条一条边添加进去. 当 m \leq n-1m≤n−1 时,我们需要最小化距离为 nn 的点对数,所以肯定是连出一个大小为 m+1m+1 的联通块,剩下的点都是孤立点.在这个联通块中 ...
- IOC+EF+Core项目搭建IOC注入及框架(二)
配置ServiceCollection /// <summary> /// 表示IServiceCollection的扩展 /// </summary> public stat ...