extract相关知识
-
Angular CLI 升级 6.0 之后遇到的问题Angular CLI 1.7.4 在使用 ng build --prod 会构建失败,而 ng build 是正常的。比较好的解决办法是使用 ng build --prod --extract-license=false 或者 ng build --prod --no-extract-license。最近将 Angular CLI 升级到 6.X 之后,直接 ng build 会报以下错误,ng serve 也是如此。95% emitting LicenseWebpackPlugin(node:6252) UnhandledPromiseRejectionWarning: Error: ENOENT: no such file or directory, open 'D:\X\project\Angular-examples\angular-test\node_modules\_
-
电商fe项目的搭建npm initnpm initnpm install webpack -gnpm install webpack@1.15.0 --save-devwebpack -vnpm install css-loader style-loader --save-devnpm install extract-text-webpack-plugin --save-devnpm install html-webpack-plugin --save-dev
-
阿里出品的ETL工具dataX初体验我的毕设选择了大数据方向的题目。大数据的第一步就是要拿到足够的数据源。现实情况中我们需要的数据源分布在不同的业务系统中,而这些系统往往是异构的,而且我们的分析过程不能影响原有业务系统的运行。为了把不同的数据归集起来,我开始了解和接触ETL。本篇介绍阿里的开源ETL工具dataX。 <!-- more --> ETL&&常用工具 ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。 我的理解就是从业务系
-
Learning Rhino - 1Rhino is an open-source implementation of JavaScript written entirely in Java. It is typically embedded into Java applications to provide scripting to end users. The rhino shell provides a simple way to run scripts in batch mode.The syntax is:java org.mozilla.javascript.tools.shell.Main [options] script-filename-or-url [script-arguments]Example 1:First of all, download the latest rhino and extract the zip file(for example: c:\rhino
extract相关课程
extract相关教程
- 2.2 例2 抽取用户新建时间 1 通过EXTRACT函数我们可以快速抽取 imooc_user 表中create_time字段的某些具体值,如获得用户是那一年被创建的:SELECT EXTRACT(YEAR FROM create_time) FROM imooc_user;+--------------------------------+| EXTRACT(YEAR FROM create_time) |+--------------------------------+| 2020 || 2020 || 2020 |+--------------------------------+我们也可以抽取具体创建的哪一秒:SELECT EXTRACT(SECOND FROM create_time) FROM imooc_user;+----------------------------------+| EXTRACT(SECOND FROM create_time) |+----------------------------------+| 55 || 55 || 50 |+----------------------------------+
- 2.5 提取重构 提取重构使源代码更易于阅读和维护。PyCharm 也提供了不同的方法,包括常量、方法及超类的提取等等。下面以提取方法为例介绍提取重构的过程:在编辑器中,选择要转换为方法或函数的代码块;从主菜单或上下文菜单中选择 Refactor -> Extract Method…Tips: 形成方法的代码片段不一定必须是一组语句。它也可以是代码中某处使用的表达式。在打开的"Extract Method"对话框中,指定新函数的名称。查看结果,所选代码片段将替换为函数调用。
- 2. 使用 zipfile 模块进行压缩与解压缩 现在 D:\code 目录已有 code.zip,内容如下图所示。接下来通过 zipfile 模块对压缩文件进行操作,zipfile 模块操作压缩文件常用方法见下表。方法名描述 namelist() 返回 ZIP 文件内所有成员名字列表 write() 添加文件到压缩包内 extract(member[, path[, pwd]]) 解压单个文件,参数 members 表示 zipfile 对象中某个文件名,path 为解压到的目的路径,默认是压缩包所在路径,pwd 为压缩包密码,默认无密码 extractall([path[, members[, pwd]]]) 解压所有文件,参数 path 为解压到的目的路径,默认是压缩包所在路径,members 默认值是压缩包文件中所有文件名称列表,也可以另外指定,pwd 为压缩包密码,默认无密码下面来具体看下每个方法的使用:namelist () 使用:import zipfile, oszipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'code.zip'))print(zipFile.namelist())#输出: ['code/', 'code/index.py', 'code/newimage/', 'code/writeppt.py', 'code/writeword.py']代码解释:namelist () 方法获取压缩包中所有文件的名字,并组成列表返回。首先通过 ZipFile 实例化 zip 文件对象,其中压缩文件这里通过 OS 模块的 join 方法进行拼接,返回一个绝对路径。通过 namelist () 方法打印输出:['code/', 'code/index.py', 'code/newimage/', 'code/writeppt.py', 'code/writeword.py']write () 使用:import zipfile, oszipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'code.zip'),'a')zipFile.write("test.txt")print(zipFile.namelist())#输出: ['code/', 'code/index.py', 'code/newimage/', 'code/writeppt.py', 'code/writeword.py','code/test.txt']代码解释:write () 方法为添加文件到压缩文件,在 D:\code 目录下,创建 test.txt 文件,通过 wirte () 方法添加到现有压缩文件 code.zip 中,执行完成后,通过 namelist () 方法重写打印压缩文件中所有成员名字列表,输出 ['code/', 'code/index.py', 'code/newimage/', 'code/writeppt.py', 'code/writeword.py','code/test.txt']。上述代码中需要注意:向压缩文件中写入内容时,注意修改 zipFile 实例化处的模式,默认为 “r”,表示只读,不可以写入,设置为 “w” 后可以写入,但会覆盖原有压缩文件中内容,如果想要追加,设置为 “a” 即可。extract () 使用:import zipfile, oszipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'code.zip'))for file in zipFile.namelist(): zipFile.extract(file)zipFile.close()代码解释:extract () 方法为单个压缩文件解压,代码中结合 namelist () 方法将 D:\code\code.zip 进行解压缩操作,解压后效果如下图所示。extractall () 使用:import zipfile, oszipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'code.zip'))zipFile.extractall()zipFile.close()代码解释:extractall () 方法为解压 zip 文档中的所有文件到指定目录,默认为压缩包所在路径,即当前目录。代码执行完成后,效果同 extract () 结合 namelist () 方法进行解压操作一样。
- 2. 实践 在 SQL 中,常见的日期函数有如下几个:函数名作用CURRENT_DATE得到当前日期CURRENT_TIME得到当前时间CURRENT_TIMESTAMP得到当前时间戳EXTRACT将英文字符串全部转为小写DATE提取时间戳的日期部分YEAR提取时间戳的年份部分MONTH提取时间戳的月份部分DAY提取时间戳的天数部分HOUR提取时间戳的小时部分MINUTE提取时间戳的分钟部分SECOND提取时间戳的秒部分提示: PostgreSQL 不支持 CURRENT_XXX 这些函数,获取当前时间戳可以使用函数 NOW。
- 2. Scrapy 与 Selenium 结合爬取京东图书数据 接下来我们对上面的代码进行调整和 Scrapy 框架结合,而第一步需要做的就是建立好相应的工程:# 创建爬虫项目PS D:\shencong\scrapy-lessons\code\chap17> scrapy startproject jdbooks# ...# 进入到spider目录,使用genspider命令创建爬虫文件PS D:\shencong\scrapy-lessons\code\chap17\jd_books\jd_books\spiders> scrapy genspider jd www.jd.com创建好工程后就是编写 items.py 中的 JdBooksItem 类,这非常简单,直接根据我们前面定义好的字段编写相应的代码即可:class JdBooksItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() book_name = scrapy.Field() price = scrapy.Field() comments = scrapy.Field() shop_name = scrapy.Field() book_detail_url = scrapy.Field()整个项目的难点是如何实现下一页数据的爬取?前面可以使用 selenium 去自动点击页号而进入下一个,然而在 Scrapy 中却不太好这样处理。我们通过分析京东搜索的 URL 后发现,其搜索的 URL 可以简化为如下形式:https://search.jd.com/Search?keyword=搜索关键字&page=(页号* 2 - 1),我们只需要提供搜索的关键字以及相应的请求页号即可。例如下图所示:京东搜索 URL 参数因此我们在 settings.py 中准备两个参数:一个是搜索的关键字,另一个是爬取的最大页数。具体的形式如下:# settings.py# ...KEYWORD = "网络爬虫"MAX_PAGE = 10紧接着我们可以构造出请求不同页的 URL 并交给 Scrapy 的引擎和调度器去处理,对应的 Spider 代码如下:# 代码位置:jd_books/jd_books/spiders/jd.pyfrom urllib.parse import quotefrom scrapy import Spider, Requestfrom jd_books.items import JdBooksItemclass JdSpider(Spider): name = 'jd' allowed_domains = ['www.jd.com'] start_urls = ['http://www.jd.com/'] base_url = "https://search.jd.com/Search?keyword={}&page={}" def start_requests(self): keyword = self.settings.get('KEYWORD', "Python") for page in range(1, self.settings.get('MAX_PAGE') + 1): url = self.base_url.format(quote(keyword), page * 2 - 1) yield Request(url=url, callback=self.parse_books, dont_filter=True) def parse_books(self, response): goods_list = response.xpath('//div[@id="J_goodsList"]/ul/li') print('本页获取图书数目:{}'.format(len(goods_list))) for good in goods_list: book_name_em = good.xpath('.//div[@class="p-name"]/a/em/text()').extract()[0] book_name_font = good.xpath('.//div[@class="p-name"]/a/em/font/text()').extract() book_name_font = "".join(book_name_font) if book_name_font else "" book_name = f"{book_name_em}{book_name_font}" book_detail_url = good.xpath('.//div[@class="p-name"]/a/@href').extract()[0] price = good.xpath('.//div[@class="p-price"]/strong/i/text()').extract()[0] comments = good.xpath('.//div[@class="p-commit"]/strong/a/text()').extract()[0] shop_name = good.xpath('.//div[@class="p-shopnum"]/a/text()').extract()[0] item = JdBooksItem() item['book_name'] = book_name item['book_detail_url'] = book_detail_url item['price'] = price item['comments'] = comments item['shop_name'] = shop_name yield item上面的代码就是单纯的生成多页的 Request 请求 (start_requests() 方法) 和解析网页数据 (parse_books() 方法)。这个解析数据完全依赖于我们获取完整的页面源码,那么如何在 Scrapy 中使用 selenium 去请求 URL 然后获取页面源码呢?答案就是下载中间件。我们在编写一个下载中间件,拦截发送的 request 请求,对于请求京东图书数据的请求我们会切换成 selenium 的方式去获取网页源码,然后将得到的页面源码封装成 Response 响应并返回。在生成 Scrapy 项目中已经为我们准备好了一个 middleware.py 文件,我们按照上面的思路来完成相应代码,具体内容如下:import timefrom scrapy import signalsfrom scrapy.http.response.html import HtmlResponsefrom selenium import webdriverfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.common.by import By# useful for handling different item types with a single interfacefrom itemadapter import is_item, ItemAdapteroptions = webdriver.ChromeOptions()# 注意,使用这个参数我们就不会看到启动的google浏览器,无界面运行options.add_argument('-headless')options.add_experimental_option("excludeSwitches", ['enable-automation'])class JdBooksSpiderMiddleware: # 保持不变 # ... class JdBooksDownloaderMiddleware: # Not all methods need to be defined. If a method is not defined, # scrapy acts as if the downloader middleware does not modify the # passed objects. def __init__(self): self.driver = webdriver.Chrome(options=options, executable_path="C:/Users/Administrator/AppData/Local/Google/Chrome/Application/chromedriver.exe") # ... def process_request(self, request, spider): # Called for each request that goes through the downloader # middleware. # Must either: # - return None: continue processing this request # - or return a Response object # - or return a Request object # - or raise IgnoreRequest: process_exception() methods of # installed downloader middleware will be called print('使用 selenium 请求页面:{}'.format(request.url)) if request.url.startswith("https://search.jd.com/Search"): # 如果是获取京东图书数据的请求,使用selenium方式获取页面 self.driver.get(request.url) time.sleep(2) # 将滚动条拖到最底端,获取一页完整的60条数据 height = self.driver.execute_script("return document.body.scrollHeight;") self.driver.execute_script(f"window.scrollBy(0, {height})") time.sleep(2) # 将最后渲染得到的页面源码作为响应返回 return HtmlResponse(url=request.url, body=self.driver.page_source, request=request, encoding='utf-8', status=200) # ...紧接着,我们需要将这个下载中间件在 settings.py 中启用:DOWNLOADER_MIDDLEWARES = { 'jd_books.middlewares.JdBooksDownloaderMiddleware': 543,}最后我们来完成下数据的存储,继续使用 mongodb 来保存抓取到的数据。从实际测试中发现京东的搜索结果在100页中肯定会有不少重复的数据。因此我们的 item pipelines 需要完成2个处理,分别是去重和保存。来直接看代码:import pymongofrom scrapy.exceptions import DropItemfrom itemadapter import ItemAdapterclass JdBooksPipeline: def open_spider(self, spider): self.client = pymongo.MongoClient(host='47.115.61.209', port=27017) self.client.admin.authenticate("admin", "shencong1992") db = self.client.scrapy_manual self.collection = db.jd_books def process_item(self, item, spider): try: book_info = { 'book_name': item['book_name'], 'comments': item['comments'], 'book_detail_url': item['book_detail_url'], 'shop_name': item['shop_name'], 'price': item['price'], } self.collection.insert_one(book_info) except Exception as e: print("插入数据异常:{}".format(str(e))) return item def close_spider(self, spider): self.client.close()class DuplicatePipeline: """ 去除重复的数据,重复数据直接抛出异常,不会进入下一个流水线处理 """ def __init__(self): self.book_url_set = set() def process_item(self, item, spider): if item['book_detail_url'] in self.book_url_set: print('重复搜索结果:book={}, url={}'.format(item['book_name'], item['book_detail_url'])) raise DropItem('duplicate book info, drop it') self.book_url_set.add(item['book_detail_url']) return item我们直接使用 Item 的 book_detail_url 字段来判断数据是否重复。此外,同样需要将这两个 Item Pipelines 在 settings.py 中启用,且保证 DuplicatePipeline 需要先于 JdBooksPipeline 处理:ITEM_PIPELINES = { 'jd_books.pipelines.DuplicatePipeline': 200, 'jd_books.pipelines.JdBooksPipeline': 300,}最后剩下一步就是禁止遵守 Robot 协议:ROBOTSTXT_OBEY = True至此,我们的 Scrapy 和 Selenium 结合爬取京东图书数据的项目就算完成了。为了快速演示效果,我们将最大请求页设置为10,然后运行代码看看实际的爬取效果:107
- 6. 完整代码案例代码 import tensorflow as tfimport osimport matplotlib.pyplot as pltdataset_url = 'https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip'path_download = os.path.dirname(tf.keras.utils.get_file('cats_and_dogs.zip', origin=dataset_url, extract=True))train_dataset_dir = path_download + '/cats_and_dogs_filtered/train'valid_dataset_dir = path_download + '/cats_and_dogs_filtered/validation'cat_train_dir = path_download + '/cats_and_dogs_filtered/train/cats'cat_validation_dir = path_download + '/cats_and_dogs_filtered/validation/cats'dog_train_dir = path_download + '/cats_and_dogs_filtered/train/dogss'dog_validation_dir = path_download + '/cats_and_dogs_filtered/validation/dogs'BATCH_SIZE = 64TRAIN_NUM = 2000VALID_NUM = 1000EPOCHS = 15Height = 128Width = 128train_image_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)valid_image_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)train_data_generator = train_image_generator.flow_from_directory(batch_size=BATCH_SIZE, directory=train_dataset_dir, shuffle=True, target_size=(Height, Width), class_mode='binary')valid_data_generator = valid_image_generator.flow_from_directory(batch_size=BATCH_SIZE, directory=valid_dataset_dir, shuffle=True, target_size=(Height, Width), class_mode='binary')model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu', input_shape=(Height, Width ,3)), tf.keras.layers.MaxPooling2D(), tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'), tf.keras.layers.MaxPooling2D(), tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'), tf.keras.layers.MaxPooling2D(), tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dense(1)])model.compile(optimizer='adam', loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['accuracy'])model.summary()history = model.fit_generator( train_data_generator, steps_per_epoch=TRAIN_NUM // BATCH_SIZE, epochs=EPOCHS, validation_data=valid_data_generator, validation_steps=VALID_NUM // BATCH_SIZE)acc = history.history['accuracy']loss=history.history['loss']val_acc = history.history['val_accuracy']val_loss=history.history['val_loss']epochs_ran = range(EPOCHS)plt.plot(epochs_ran, acc, label='Train Acc')plt.plot(epochs_ran, val_acc, label='Valid Acc')plt.show()plt.plot(epochs_ran, loss, label='Train Loss')plt.plot(epochs_ran, val_loss, label='Valid Loss')plt.show()
extract相关搜索
-
e preventdefault
e4a
each
each的用法
easter
easter day
easyui
easyui 官网
echarts
eclipse
eclipse 64位下载
eclipse android
eclipse tomcat
eclipse 教程
eclipse 快捷键
eclipseadt
eclipse安装教程
eclipse插件
eclipse插件下载
eclipse教程