comments相关知识
-
MySQL字段自增自减的SQL语句示例介绍 MySQL的自增语句大家应该都很熟悉 也很简单 复制代码 代码如下: update `info` set `comments` = `comments`+1 WHERE `id` = 32 这样就可以了,但是有时候我们会涉及到做减法, 例如:文章的评论数,在删除或者锁定了一条评论之后需要对该文章总评论数减一 comments smallint(5) unsigned 文章评论总数统计字段 无符号即 0 ~ 65535 之间的数值 1. 通常情况下是可以类似上面自增的方法 把 +号 改成 -号 就行了,但问题是如果当前 comments 统计数值为 0 时 再做减法将会变成该字段类型的最大数值 65535 复制代码 代码如下: update `info` set `comments` = `comments`-1 WHERE `id` = 32 2. 为避免这个问题一般的想法只能是先根据 id 主键查询出文章 comment
-
五十二章 TP51之关联模型一对多关联<?phpnamespace app\index\model;use think\Model;class Article extends Model { public function comments() { return $this->hasMany('Comment','art_id','id');}}}关联查询我们可以通过下面的方式获取关联数据$article = Article::get(1);// 获取文章的所有评论dump($article->comments);// 也可以进行条件搜索dump($article->comments()->where('status',1)->select());根据关联条件查询可以根据关联条件来查询当前模型对象数据,例如:// 查询评论超过3个的
-
java学习第二季的项目代码java学习第二季的项目代码 Vehicle类。是bus、truck、pickup的父类 package pmy.test; /* *Project: Lease System *Comments: 汽车类,客车、火车、皮卡类的基类 *JDK version used: JDK1.8 *Author: Pmy *Create Date: 2016-09-13 */ public class Vehicle { private String s_name; private int i_price; public void setName(String name){ this.s_name = name; } public String getName(){ return s_name; } public void setPrice(int price
-
Python练手,numpy.genfromtxt# -*- coding: utf-8 -*- '''about numpy.genfromtxt, means generate from txt file https://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html numpy.genfromtxt(fname, dtype=<type 'float'>, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=No
comments相关课程
comments相关教程
- 3.1 单行注释 单行注释是在 // 后面跟你的注释内容,直到行尾,要记住 Sass 中的单行注释不会被编译到 CSS 中,也就是说在转换为 CSS 代码后,是不会包含你写的单行注释的!我们举个例子来看下:// This is a comments// This is a comments.box2 { width: 200px; height: 100px; p { color: red } .main { width: 100%; }}上面的代码转换为 CSS 如下:.box2 { width: 200px; height: 100px;}.box2 p { color: red;}.box2 .main { width: 100%;}从上面的代码中我们可以看出,转换为 CSS 后我们在 Sass 中写的单行注释消失了。
- 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_MIDDLEWA