sudo apt-get install python3.6-tk
QueryAction.Gopage 看下這個(gè)函數(shù)怎么運(yùn)行 模擬下,
簡(jiǎn)單的就看下network 看下規(guī)律
1、如果請(qǐng)求中有自定義header,在發(fā)送真正的請(qǐng)求前, 會(huì)先發(fā)送一個(gè)方法為 options 的預(yù)請(qǐng)求, 用于試探服務(wù)端是否能接受真正的請(qǐng)求。
2、跨域的請(qǐng)求本來(lái)就拿不到response。
先看書,別用學(xué)習(xí)java、PHP那套做項(xiàng)目方法
您好,請(qǐng)問(wèn)下這個(gè)問(wèn)題您解決了嗎?我也遇到了這種需求,能否一起探討下?感謝。
不需要什么算法
var myArray = ['1001|電腦','1002|個(gè)人電腦','99|華碩電腦','100|華碩筆記本'];
var id = 100;
var result = [];
for (var i = 0; i < myArray.length; i++) {
var sec = myArray[i].split('|', 2);
var theid = parseInt(sec[0]);
var thename = sec[1];
result.push(thename);
if (theid == id) {
break;
}
}
console.log(result);
ES6:
let myArray = ['1001|電腦','1002|個(gè)人電腦','99|華碩電腦','100|華碩筆記本'];
let id = 99;
let last = myArray.findIndex(v=> parseInt( v.split('|', 2)[0] ) ===id )
myArray.slice(0, last+1).forEach(v=> alert( v.split('|', 2)[0] ));你要實(shí)現(xiàn)的是消費(fèi)者的負(fù)載均衡,默認(rèn)來(lái)說(shuō),RabbitMQ會(huì)按順序得把消息發(fā)送給每個(gè)消費(fèi)者(consumer)。平均每個(gè)消費(fèi)者都會(huì)收到同等數(shù)量得消息。這種發(fā)送消息得方式叫做——輪詢(round-robin)。試著添加三個(gè)或更多得工作者(workers)。當(dāng)然你可以使用其他的負(fù)載均衡策略。
具體可參考:https://blog.csdn.net/u013256...
為什么要弄兩個(gè)spider呢?你完完全全可以在第一個(gè)spider下再寫一個(gè)parse_shuping_two啊.
對(duì)你的代碼稍作了修改,可以達(dá)到你的要求(別忘了在settings.py中加上ITEM_PIPELINES = {'ysw.pipelines.YswPipeline': 300}以激活pipeline):
spiders/shuping.py
# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request
from ysw.items import YswItem, YswItems
import json
from scrapy import Selector
import re
class ShupingSpider(scrapy.Spider):
name = 'shuping'
#allowed_domains = ['www.yousuu.com']
start_urls = ['http://www.yousuu.com/book/124600']
#此方法解析評(píng)論第一頁(yè)的一級(jí)書評(píng)
def parse(self, response):
#遍歷每個(gè)一級(jí)書評(píng),獲得信息
for r in response.xpath('//*[@id="content"]/div'):
item = YswItem()
#發(fā)帖時(shí)間
item['time'] = r.xpath('string(./div/div/div[1]/div/span[2])').extract_first().strip()
#獲得贊同數(shù)
agree = r.xpath('string(./div/div/div[2]/button[1]/span)').extract_first().strip()
if agree:
item['agree'] = agree
else:
item['agree'] = '0'
#一級(jí)書評(píng)內(nèi)容
item['fir_text'] = r.xpath('string(./div/div/p)').extract_first().replace('\r\n', '').replace(' ', '')
#二級(jí)評(píng)論數(shù):
sec_num = r.xpath('string(./div/div/div[2]/button[2]/span)').extract_first().strip()
if sec_num:
item['sec_num'] = sec_num
#獲取二級(jí)評(píng)論url的組成部分cid
cid = r.xpath('./@cid').extract_first().strip()
#補(bǔ)全二級(jí)評(píng)論第一頁(yè)的url
sec_text_url = "http://www.yousuu.com/ajax/getonecomment?render=true&cid={}".format(cid)
#將每一個(gè)一級(jí)書評(píng)下的所有二級(jí)書評(píng)的獲取都交給sp_two.parse
sec_text_list = []
yield Request(sec_text_url, meta={'sec_text_list':sec_text_list, 'item':item}, callback=self.parse_shuping_two)
else:
item['sec_num'] = '0'
yield item
return print('一級(jí)書評(píng)第一頁(yè)!')
def parse_shuping_two(self, response):
items = YswItems()
# json格式轉(zhuǎn)為python結(jié)構(gòu)數(shù)據(jù)
jsobj = json.loads(response.body)
# 從字典中提取html的值,也就是二級(jí)評(píng)論的html格式文本
html = jsobj['html']
# 獲得二級(jí)書評(píng)第一頁(yè)的所有二級(jí)書評(píng)內(nèi)容,放在列表result中,迭代這個(gè)parse方法時(shí),依次是第2,3,頁(yè)等等
result = Selector(text=html).xpath('//p/text()').extract()
# 獲得上一個(gè)Request傳遞過(guò)來(lái)的參數(shù), 第一次是一個(gè)空列表
sec_text_list = response.meta['sec_text_list']
# 獲得shuping.parse()傳來(lái)的item
item = response.meta['item']
'''每一頁(yè)的二級(jí)評(píng)論內(nèi)容放在一個(gè)列表result中,這個(gè)列表又放在列表sec_text_list中
二級(jí)書評(píng)每一頁(yè)的第一個(gè)書評(píng)都是它的一級(jí)書評(píng)內(nèi)容,所以從每一頁(yè)新的二級(jí)書評(píng)從第二個(gè)算起'''
sec_text_list.extend(result[1:])
# 判斷二級(jí)評(píng)論是否還有下一頁(yè)
nextpage = Selector(text=html).xpath('//a[text()="更多回復(fù)"]/@onclick').extract_first()
if nextpage:
# 獲得下一頁(yè)的cid
cid = re.search(r"(.*?)'(.*?)',(.*)", nextpage).group(2)
# 獲取下一頁(yè)的t
t = re.search("(.*),(.*?)\)", nextpage).group(2)
# 組裝二級(jí)評(píng)論下一頁(yè)的url
next_page_url = "http://www.yousuu.com/ajax/getcommentreply?cid={}&t={}&render=true".format(cid, t)
# print('next_page_url')
# 迭代這個(gè)方法繼續(xù)獲得下一頁(yè)的二級(jí)評(píng)論內(nèi)容
yield Request(next_page_url, meta={'sec_text_list': sec_text_list, 'item': item}, callback=self.parse_shuping_two)
else:
items['sec_text'] = sec_text_list
items['time'] = item['time']
items['agree'] = item['agree']
items['sec_num'] = item['sec_num']
items['fir_text'] = item['fir_text']
print('已獲取此一級(jí)書評(píng)的全部二級(jí)書評(píng)!')
yield items
pipelines.py
# -*- coding: utf-8 -*-
import os
class YswPipeline(object):
def process_item(self, item, spider):
base_dir = os.getcwd()
file_name = base_dir + '/SP.txt'
with open(file_name, 'a', encoding='utf-8') as f:
if item['sec_num'] == '0':
f.write('時(shí)間:' + item['time'] + '\n'
'贊同數(shù):' + item['agree'] + '\n'
'二級(jí)評(píng)論數(shù)量:' + item['sec_num'] + '\n'
'一級(jí)評(píng)論內(nèi)容:' + item['fir_text'] + '\n\n'
)
else:
f.write('時(shí)間:' + item['time'] + '\n'
'贊同數(shù):' + item['agree'] + '\n'
'二級(jí)評(píng)論數(shù)量:' + item['sec_num'] + '\n'
'一級(jí)評(píng)論內(nèi)容:' + item['fir_text'] + '\n'
'二級(jí)評(píng)論內(nèi)容:' + '\n'.join(item['sec_text']) + '\n\n'
)
return item我覺(jué)得你其實(shí)可以就在一個(gè)隊(duì)列里面處理。你說(shuō)的太吃力,指的是哪方面的?是速度慢,還是會(huì)失???
我用隊(duì)列處理過(guò)10萬(wàn)多行的數(shù)據(jù),但不是生成文件,而是更新插入到數(shù)據(jù)庫(kù),耗時(shí)大約在1-2小時(shí)
Request header field timestamp is not allowed by Access-Control-Allow-Headers in preflight response.
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, timestamp ");鍵值1 也浪費(fèi)不了多少吧
一般key要加個(gè)前綴以區(qū)分
例如:product_, order_
postgre, 一對(duì)多用數(shù)組
WITH C AS (SELECT 商品ID,ARRAY_AGG(標(biāo)簽) AS 標(biāo)簽 FROM B GROUP BY 商品ID)
SELECT A.*, 標(biāo)簽 FROM A LEFT JOIN C USING(商品ID) WHERE 你的條件先考慮000000 ~ 999999(假設(shè)不忽略前面的 0) 一共一百萬(wàn)個(gè)數(shù),這一百萬(wàn)個(gè)數(shù)一共有10^6 * 6 個(gè)數(shù)字,10個(gè)數(shù)字都是對(duì)稱的,因此,一共有10^6*6/10 = 6*10^5 個(gè) 0。 但是對(duì)于不足 6 位的數(shù)我們要去掉第六位上的 0, 這一共有 10^5 個(gè)數(shù),對(duì)于不足 5 位的數(shù)我們要去掉第五位上的 0, 這一共有 10^4 個(gè)數(shù)。。。。。
最后還要加上 100萬(wàn)的六個(gè)0。
因此6*10^5 - 10^5 - 10^4 ... - 10 - 1 + 6 = 488895個(gè)
按@Masterton 個(gè)的 PHP 轉(zhuǎn)個(gè) JS 是
var a=[], i;
for(i=0; i< 1000000; i++) {a[i] = i+1;}
num = a.join('').replace(/[1-9]/g,'').length;
結(jié)果也是488895
你說(shuō)的應(yīng)該是vue-cli生成的配置文件上的proxytable吧
1.事實(shí)上在你運(yùn)行的時(shí)候,會(huì)配置啟動(dòng)一個(gè)node服務(wù),這個(gè)服務(wù)的作用1是靜態(tài)文件服務(wù),讓你可以訪問(wèn)到html/js等文件包括監(jiān)聽(tīng)文件變動(dòng)等,2是啟動(dòng)一個(gè)http代理,你js發(fā)送的請(qǐng)求會(huì)請(qǐng)求到這個(gè)服務(wù)A,由服務(wù)A代理到服務(wù)B,而服務(wù)A和靜態(tài)文件服務(wù)器是同源的,并不影響同源策略。
2.瀏覽器是沒(méi)有必要設(shè)置CORS的,服務(wù)器設(shè)置CORS就是為了告知瀏覽器允許訪問(wèn)我的源,不是跟我同源的,要在瀏覽器接受到響應(yīng)后拋出錯(cuò)誤。
*第一步:排序,時(shí)間從近到遠(yuǎn)
*第二步:分割,將數(shù)組分成5個(gè)一組,返回新數(shù)組
*第三步:抽離,將相同時(shí)間抽離出來(lái)組成要求上的數(shù)據(jù)格式
第一步:排序
var compare = function (prop) {
return function (obj1, obj2) {
var val1 = obj1[prop];
var val2 = obj2[prop];
if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
val1 = Number(val1);
val2 = Number(val2);
}
if (val1 < val2) {
return 1;
} else if (val1 > val2) {
return -1;
} else {
return 0;
}
}
}
//用法
arr.sort(compare("time"))
第二步:分割
//分割
Array.prototype.chunk = function(size) {
var array = this;
const length = array.length
if (!length || !size || size < 1) {
return []
}
let index = 0
let resIndex = 0
let result = new Array(Math.ceil(length / size))
while (index < length) {
result[resIndex++] = array.slice(index, (index += size))
}
return result
}
//用法
arr.chunk(5)
第三步:抽離
//抽離
function sortArr(arr, str) {
var _arr = [],
_t = [],
// 臨時(shí)的變量
_tmp;
// 按照特定的參數(shù)將數(shù)組排序?qū)⒕哂邢嗤档门旁谝黄? arr = arr.sort(function(a, b) {
var s = a[str],
t = b[str];
return s < t ? -1 : 1;
});
if ( arr.length ){
// _tmp = arr[0][str];
_tmp = new Date(arr[0][str]).getFullYear()
}
// 將相同類別的對(duì)象添加到統(tǒng)一個(gè)數(shù)組
for (let i=0;i<arr.length;i++) {
if(new Date(arr[i][str]).getFullYear()===_tmp){
// if ( arr[i][str] === _tmp ){
_t.push( arr[i] );
} else {
_tmp = new Date(arr[i][str]).getFullYear();
_arr.push( _t );
_t = [arr[i]];
}
}
// 將最后的內(nèi)容推出新數(shù)組
_arr.push(_t);
return _arr;
}
//用法,這里僅對(duì)一維數(shù)組使用
sortArr( arr, 'time')
//我將數(shù)據(jù)一二步處理后開(kāi)始二叉數(shù)循環(huán)
var cc = arr.sort(compare("time")).chunk(5)
var _cc = []
for(let i=0;i<cc.length;i++){
//抽離
var _datas=sortArr( cc[i], 'time')
//根據(jù)所給數(shù)據(jù)結(jié)構(gòu)進(jìn)行賦值
_cc.push({section:i+1, sectionDatas:[]})
for(let o=0;o<_datas.length;o++){
_cc[i].sectionDatas.push({
data:new Date(_datas[o][0].time).getFullYear(),
datas:[]
})
}
for(let p=0;p<_cc[i].sectionDatas.length;p++){
_cc[i].sectionDatas[p].datas=sortArr(cc[i], 'time')[p]
}
}
功力不夠,謹(jǐn)慎使用
class Functor {
constructor(data){
this.data = data
}
map(data){
return new Functor(data)
}
//排序
compare(prop) {
var result = this.data.sort(function (obj1, obj2) {
var val1 = obj1[prop];
var val2 = obj2[prop];
if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
val1 = Number(val1);
val2 = Number(val2);
}
if (val1 < val2) {
return 1;
} else if (val1 > val2) {
return -1;
} else {
return 0;
}
})
return this.map(result)
}
//分割
chunk(size) {
var array = this.data;
//獲取數(shù)組的長(zhǎng)度,如果你傳入的不是數(shù)組,那么獲取到的就是undefined
const length = array.length
//判斷不是數(shù)組,或者size沒(méi)有設(shè)置,size小于1,就返回空數(shù)組
if (!length || !size || size < 1) {
return []
}
//核心部分
let index = 0 //用來(lái)表示切割元素的范圍start
let resIndex = 0 //用來(lái)遞增表示輸出數(shù)組的下標(biāo)
//根據(jù)length和size算出輸出數(shù)組的長(zhǎng)度,并且創(chuàng)建它。
let result = new Array(Math.ceil(length / size))
//進(jìn)行循環(huán)
while (index < length) {
//循環(huán)過(guò)程中設(shè)置result[0]和result[1]的值。該值根據(jù)array.slice切割得到。
result[resIndex++] = array.slice(index, (index += size))
}
//輸出新數(shù)組
// return result
return this.map(result)
}
//抽離
sortArr(arr, str) {
var _arr = [],
_t = [],
// 臨時(shí)的變量
_tmp;
// 按照特定的參數(shù)將數(shù)組排序?qū)⒕哂邢嗤档门旁谝黄? arr = arr.sort(function(a, b) {
var s = a[str],
t = b[str];
return s < t ? -1 : 1;
});
if ( arr.length ){
// _tmp = arr[0][str];
_tmp = new Date(arr[0][str]).getFullYear()
}
// 將相同類別的對(duì)象添加到統(tǒng)一個(gè)數(shù)組
for (let i=0;i<arr.length;i++) {
if(new Date(arr[i][str]).getFullYear()===_tmp){
// if ( arr[i][str] === _tmp ){
_t.push( arr[i] );
} else {
_tmp = new Date(arr[i][str]).getFullYear();
_arr.push( _t );
_t = [arr[i]];
}
}
// 將最后的內(nèi)容推出新數(shù)組
_arr.push(_t);
return _arr;
}
//轉(zhuǎn)指定json格式
dataToJSON(){
var _json = []
var _this = this;
this.data.forEach(function(item,i){
var _datas=_this.sortArr( item, 'time')
_json.push({section:i+1, sectionDatas:[]})
for(let o=0;o<_datas.length;o++){
_json[i].sectionDatas.push({
data:new Date(_datas[o][0].time).getFullYear(),
datas:[]
})
}
for(let p=0;p<_json[i].sectionDatas.length;p++){
_json[i].sectionDatas[p].datas=_datas[p]
}
})
return _json
}
}
Functor.of = function(data){
return new Functor(data)
}
使用方法
Functor.of(a).compare("time").chunk(5).dataToJSON() //返回一個(gè)新的值,不改變?cè)瓉?lái)數(shù)據(jù)分布式系統(tǒng)需要部署到多節(jié)點(diǎn),除了性能需求外,還是考慮容災(zāi)需求。最簡(jiǎn)單的有 mysql 主備兩節(jié)點(diǎn)部署,復(fù)雜的有兩地三中心部署。
首先據(jù)我所知OpenCV有iOS版本,訓(xùn)練好的人臉識(shí)別數(shù)據(jù)也不大。
然后蘋果好像也有自己的AI框架。
因?yàn)锳dvisor這個(gè)接口有PointcutAdvisor和IntroductionAdvisor兩個(gè)子接口和一個(gè)靜態(tài)內(nèi)部實(shí)現(xiàn)類PrototypePlaceholderAdvisor,所以這樣判斷。
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。