quote相关知识
-
python 中文url编码处理可以直接处理中英混排的urlfrom urllib.parse import quote (python3)from urllib import quote (python2)url = 'http://www.baidu.com?search=中文在这里'不带附加参数print('\n不带附加参数:\n%s' % quote(url))附带不转换字符参数print('\n附加不转换字符参数:\n%s' % quote(url, safe='/:?='))
-
mysql select随机行Summary: in this tutorial, you will learn various techniques to select random records from a database table in MySQL.Sometimes, you have to select random records from a database table, for example:Select some random posts in a blog and display them in the sidebar.Select a random quote for displaying “quote of the day” widget.Select random pictures in a gallery and use the as the featured pictures.MySQL select random records using RAND functionMyS
-
CSS3的content属性详解原文链接CSS中主要的伪元素有四个:before/after/first-letter/first-line,在before/after伪元素选择器中,有一个content属性,能够实现页面中的内容插入。插入纯文字content : ”插入的文章”,或者 content:none 不插入内容#html<h1>这是h1</h1> <h2>这是h2</h2>#cssh1::after{ content:"h1后插入内容"} h2::after{ content:none }运行结果:https://jsfiddle.net/dwqs/Lmm1r08x/嵌入文字符号可以使用content属性的 open-quote 属性值和 close-quote 属性值在字符串两边添加诸如括号、单引号、双引号之类的嵌套文字符号。open-quote 用于添加开始的文
-
R语言读CSV、txt文件方式以及read.table read.csv 和readr(大数据读取包)首先准备测试数据*(mtcars)分别为CSV. TXTread.table 默认形式读取CSV(×)与TXT(效果理想) ①> test<-read.table("C:/Users/admin/Desktop/test.txt",header = F) Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : line 1 did not have 12 elements > test<-read.table("C:/Users/admin/Desktop/test.txt") > str(test)'data.frame': 32 obs. of 11 variables: $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... $ cyl : int 6 6 4 6 8 6 8
quote相关课程
quote相关教程
- 1.8 escape 控制 HTML 转义,替换 value 中的某些 HTML 特殊字符。< is converted to <> is converted to >' (single quote) is converted to '" (double quote) is converted to &quto;& is converted to &{% autoescape off %} {{ title|escape }}{% endautoescape %}
- 4. 语法示例 我们先来看一段 Sass 函数的代码来直观感受一下:$list: [1,2,4,5];$string: 'string';$substring: 'str';.box { font-size:length($list); // 列表函数 font: quote($string); // 字符串函数 font: str-index($string, $substring); // 字符串函数 color: adjust-hue(#6b717f, 60deg); // 颜色函数 border-width: ceil(4.2); // 数字函数 width: percentage(.7); // 数字函数 font: type-of(#676767); // Introspection函数}上面的示例代码中我们举了几种函数的例子,在实际开发中并不会这么写,这里把它们作为属性值只是为了直观的展示,所以先不要在意属性;可以从上面的例子看出,函数的使用就像 javascript 中的函数一样,通过函数名来调用,然后在括号中传参,最后会得到函数的返回结果,那上面示例中这些函数的返回结果是什么呢?转换为 CSS 的代码如下:.box { font-size: 4; font: "string"; font: 1; color: #796b7f; border-width: 5; width: 70%; font: color;}可以看到上面转换为 CSS 的代码中的属性值就是函数的返回结果,可能在这里你还不是很懂,没关系下面我们开始详细讲解 Sass 提供的这些函数!在这里你要知道 Sass 中的函数也是通过函数名调用并传参,最后 Sass 会为你返回函数的执行结果。
- 5.1 字符串函数 字符串函数主要提供了字符串类型的相关操作,就像在 javascript 中一样,Sass 提供的字符串函数可以获取字符串的长度,字符串的下标以及字符串中的大小写字母转换等等。5.1.1 quote ($ string) 和 unquote($ string)这两个函数我们放在一起讲解,它们都接收 1 个参数,参数是字符串类型,quote($string) 函数的返回结果是 以带引号的形式返回你传入的字符串,反之 unquote($string) 函数的返回结果是以不带引号的形式返回你传入的字符串,我们举例看下:string.quote(aaa) //=> "aaa"unquote("bbb") //=> bbb5.1.2 str-index($string, $substring)str-index($string, $substring) 函数接收 2 个参数,返回 $substring 在 $string 中的第一次出现的索引,如果在 $string 中不包含 $substring 则返回 null ,我们举例看下:str-index("abcde", "a") //=> 1str-index("abcde", "c") //=> 35.1.3 str-insert($string, $insert, $index)看见 insert 这个词我们就能猜到,这个函数是用于字符串的插入,str-insert($string, $insert, $index) 函数接收 3 个参数,第 1 个参数是一个字符串,第 2 个参数是要插入的字符串,第 3 个参数是插入的位置,返回结果是插入后的字符串:str-insert("abcde", "j", 1) //=> "jabcde"str-insert("abcde", "j", 4) //=> "abcjde"str-insert("abcde", "j", 100) //=> "abcdej"str-insert("abcde", "j", -20) //=> "jabcde"从上面的例子我们可以看到,当第 3 个参数大于 $string 的长度,将会插入到,末尾;反之,如果小于 $string 长度的负值,则会插入到开始位置。5.1.4 str-length($string)这个函数用于获取传入的字符串的长度,只接收一个字符串参数,返回值是它的长度,返回值是 number 类型,我们举例看下:str-length("abcde") //=> 55.1.5 str-slice($string, $start-at, $end-at)这个函数用于字符串的截取,str-slice($string, $start-at, $end-at) 函数接收 3 个参数,第 1 个参数是一个字符串,第 2 个参数是要截取的开始位置,第 3 个参数是要截取的结束位置,返回结果是截取到的字符串;要记住 Sass 的字符串截取函数返回的字符串是包含截取的开始和结束位置字符的,我们举例看下:str-slice("abcde", 1, 2) //=> "ab"str-slice("abcde", 2, 4) //=> "bcd"5.1.6 to-upper-case($string) 和 to-lower-case($string)这两个函数我们放在一起来讲解,它们都接收 1 个字符串参数;to-upper-case($string) 函数 将传入的字符串转换为大写并返回,to-lower-case($string) 函数将传入的字符串转换为小写并返回:to-upper-case("abcde") //=> "ABCDE" 转为大写to-upper-case("Abc") //=> "ABC" 转为大写to-lower-case("ABC") //=> "abc" 转为小写to-lower-case("Abc") //=> "abc" 转为小写5.1.7 unique-id()unique-id() 函数会返回一个随机的字符串,并且这个字符串在 Sass 编译中是唯一的,这个我们用得不多,不过当你需要生成一个唯一的字符串标识的时候你可以使用它:unique-id() //=> urgdjis上面我们讲解了字符串函数,字符串函数可以让你方便地操作字符串,还为你提供了对字符串的增删改查功能,下面我们来讲解数字函数。
- 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
- 算法模型体系 给Java中级工程师进阶突围
- 4-1 APT采集页面路由信息 Android应用构建技术精讲与实战
quote相关搜索
-
qingkong
qsort
quartz
quartz插件
quartz配置
queue
quit
quota
quotacheck
quote
quoted printable
quotename
quotes
七牛云存储
奇数偶数
气泡图
前端开发
钱币符号
求职面试技巧
区块链是什么