欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)激活碼778899分享:scrapy實(shí)現(xiàn)增量式爬取

柚子快報(bào)激活碼778899分享:scrapy實(shí)現(xiàn)增量式爬取

http://yzkb.51969.com/

novel_ImageUrl = novel_ImageUrl,

_id = novel_ID, #小說id作為唯一標(biāo)識(shí)符

novel_Writer = novel_Writer,

novel_Status = novel_Status,

novel_Words = novel_Words,

novel_UpdateTime = novel_UpdateTime,

novel_AllClick = novel_AllClick,

novel_MonthClick = novel_MonthClick,

novel_WeekClick = novel_WeekClick,

novel_AllComm = novel_AllComm,

novel_MonthComm = novel_MonthComm,

novel_WeekComm = novel_WeekComm,

novel_Url = novel_Url,

novel_Introduction = novel_Introduction,

)

return bookitem

2.解析章節(jié)信息

def parse_chapter_content(self,response):

if not response.body:

print(response.url+“已經(jīng)被爬取過了,跳過”)

return;

ht = response.body.decode(‘utf-8’)

text = html.fromstring(ht)

soup = BeautifulSoup(ht)

novel_ID = response.url.split(“/”)[-2]

novel_Name = text.xpath(“.//p[@class=‘fr’]/following-sibling::a[3]/text()”)[0]

chapter_Name = text.xpath(“.//h1[1]/text()”)[0]

‘’’

chapter_Content = “”.join(“”.join(text.xpath(“.//dd[@id=‘contents’]/text()”)).split())

if len(chapter_Content) < 25:

chapter_Content = “”.join(“”.join(text.xpath(“.//dd[@id=‘contents’]//*/text()”)))

pattern = re.compile(‘dd id=“contents”.?>(.?)’)

match = pattern.search(ht)

chapter_Content = “”.join(match.group(1).replace("?“,”").split()) if match else “爬取錯(cuò)誤”

‘’’

result,number = re.subn(“<.*?>”,“”,str(soup.find(“dd”,id=‘contents’)))

chapter_Content = “”.join(result.split())

print(len(chapter_Content))

novel_ID = response.url.split(“/”)[-2]

return ChapterItem(

chapter_Url = response.url,

_id=int(response.url.split(“/”)[-1].split(“.”)[0]),

novel_Name=novel_Name,

chapter_Name=chapter_Name,

chapter_Content= chapter_Content,

novel_ID = novel_ID,

is_Error = len(chapter_Content) < 3000

)

3.scrapy中實(shí)現(xiàn)增量式爬取的幾種方式

1.緩存

通過開啟緩存,將每個(gè)請(qǐng)求緩存至本地,下次爬取時(shí),scrapy會(huì)優(yōu)先從本地緩存中獲得response,這種模式下,再次請(qǐng)求已爬取的網(wǎng)頁不用從網(wǎng)絡(luò)中獲得響應(yīng),所以不受帶寬影響,對(duì)服務(wù)器也不會(huì)造成額外的壓力,但是無法獲取網(wǎng)頁變化的內(nèi)容,速度也沒有第二種方式快,而且緩存的文件會(huì)占用比較大的內(nèi)存,在setting.py的以下注釋用于設(shè)置緩存

#HTTPCACHE_ENABLED = True

#HTTPCACHE_EXPIRATION_SECS = 0

#HTTPCACHE_DIR = ‘httpcache’

#HTTPCACHE_IGNORE_HTTP_CODES = []

#HTTPCACHE_STORAGE = ‘scrapy.extensions.httpcache.FilesystemCacheStorage’

這種方式比較適合內(nèi)存比較大的主機(jī)使用,我的阿里云是最低配的,在爬取半個(gè)晚上接近27W個(gè)章節(jié)信息后,內(nèi)存就用完了

2.對(duì)item實(shí)現(xiàn)去重

本文開頭的第一種方式,實(shí)現(xiàn)方法是在pipelines.py中進(jìn)行設(shè)置,即在持久化數(shù)據(jù)之前判斷數(shù)據(jù)是否已經(jīng)存在,這里我用的是mongodb持久化數(shù)據(jù),邏輯如下

#處理書信息

def process_BookItem(self,item):

bookItemDick = dict(item)

try:

self.bookColl.insert(bookItemDick)

print(“插入小說《%s》的所有信息”%item[“novel_Name”])

except Exception:

print(“小說《%s》已經(jīng)存在”%item[“novel_Name”])

#處理每個(gè)章節(jié)

def process_ChapterItem(self,item):

try:

self.contentColl.insert(dict(item))

print(‘插入小說《%s》的章節(jié)"%s"’%(item[‘novel_Name’],item[‘chapter_Name’]))

except Exception:

print(“%s存在了,跳過”%item[“chapter_Name”])

def process_item(self, item, spider):

‘’’

if isinstance(item,ChaptersItem):

self.process_ChaptersItem(item)

‘’’

if isinstance(item,BookItem):

self.process_BookItem(item)

if isinstance(item,ChapterItem):

self.process_ChapterItem(item)

return item

兩種方法判斷mongodb中是否存在已有的數(shù)據(jù),一是先查詢后插入,二是先設(shè)置唯一索引或者主鍵再直接插入,由于mongodb的特點(diǎn)是插入塊,查詢慢,所以這里直接插入,需要將唯一信息設(shè)置為”_id”列,或者設(shè)置為唯一索引,在mongodb中設(shè)置方法如下

db.集合名.ensureIndex({“要設(shè)置索引的列名”:1},{“unique”:1})

需要用什么信息實(shí)現(xiàn)去重,就將什么信息設(shè)置為唯一索引即可(小說章節(jié)信息由于數(shù)據(jù)量比較大,用于查詢的列最好設(shè)置索引,要不然會(huì)非常慢),這種方法對(duì)于服務(wù)器的壓力太大,而且速度比較慢,我用的是第二種方法,即對(duì)已爬取的url進(jìn)行去重

3.對(duì)url實(shí)現(xiàn)去重

對(duì)我而言,這種方法是最好的方法,因?yàn)樗俣瓤?,?duì)網(wǎng)站服務(wù)器的壓力也比較小,不過網(wǎng)上的資料比較少,后來在文檔中發(fā)現(xiàn)scrapy可以自定義下載中間件,才解決了這個(gè)問題

文檔原文如下

class scrapy.downloadermiddlewares.DownloaderMiddleware

process_request(request, spider) 當(dāng)每個(gè)request通過下載中間件時(shí),該方法被調(diào)用。

process_request() 必須返回其中之一: 返回 None 、返回一個(gè) Response 對(duì)象、返回一個(gè) Request

對(duì)象或raise IgnoreRequest 。

如果其返回 None ,Scrapy將繼續(xù)處理該request,執(zhí)行其他的中間件的相應(yīng)方法,直到合適的下載器處理函數(shù)(download

handler)被調(diào)用, 該request被執(zhí)行(其response被下載)。

如果其返回 Response 對(duì)象,Scrapy將不會(huì)調(diào)用 任何 其他的 process_request() 或

process_exception() 方法,或相應(yīng)地下載函數(shù); 其將返回該response。 已安裝的中間件的

process_response() 方法則會(huì)在每個(gè)response返回時(shí)被調(diào)用。

如果其返回 Request 對(duì)象,Scrapy則停止調(diào)用

process_request方法并重新調(diào)度返回的request。當(dāng)新返回的request被執(zhí)行后,

相應(yīng)地中間件鏈將會(huì)根據(jù)下載的response被調(diào)用。

如果其raise一個(gè) IgnoreRequest 異常,則安裝的下載中間件的 process_exception()

方法會(huì)被調(diào)用。如果沒有任何一個(gè)方法處理該異常,

則request的errback(Request.errback)方法會(huì)被調(diào)用。如果沒有代碼處理拋出的異常,

則該異常被忽略且不記錄(不同于其他異常那樣)。

所以只需要在process_request中實(shí)現(xiàn)去重的邏輯就可以了,代碼如下

class UrlFilter(object):

#初始化過濾器(使用mongodb過濾)

def init(self):

self.settings = get_project_settings()

self.client = pymongo.MongoClient(

host = self.settings[‘MONGO_HOST’],

port = self.settings[‘MONGO_PORT’])

self.db = self.client[self.settings[‘MONGO_DB’]]

self.bookColl = self.db[self.settings[‘MONGO_BOOK_COLL’]]

#self.chapterColl = self.db[self.settings[‘MONGO_CHAPTER_COLL’]]

self.contentColl = self.db[self.settings[‘MONGO_CONTENT_COLL’]]

def process_request(self,request,spider):

if (self.bookColl.count({“novel_Url”:request.url}) > 0) or (self.contentColl.count({“chapter_Url”:request.url}) > 0):

return http.Response(url=request.url,body=None)

但是又會(huì)有一個(gè)問題,就是有可能下次開啟時(shí),種子url已經(jīng)被爬取過了,爬蟲會(huì)直接關(guān)閉,后來想到一個(gè)笨方法解決了這個(gè)問題,即在pipeline.py里的open_spider方法中再爬蟲開啟時(shí)刪除對(duì)種子url的緩存

def open_spider(self,spider):

self.bookColl.remove({“novel_Url”:“http://www.23us.so/xiaoshuo/414.html”})

3.結(jié)果

目前一個(gè)晚上爬取了大約1000部小說35W個(gè)章節(jié)的信息,還在繼續(xù)爬取中

[

自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。

深知大多數(shù)Python工程師,想要提升技能,往往是自己摸索成長(zhǎng)或者是報(bào)班學(xué)習(xí),但對(duì)于培訓(xùn)機(jī)構(gòu)動(dòng)則幾千的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前!

因此收集整理了一份《2024年P(guān)ython開發(fā)全套學(xué)習(xí)資料》,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。

既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上前端開發(fā)知識(shí)點(diǎn),真正體系化!

由于文件比較大,這里只是將部分目錄大綱截圖出來,每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會(huì)持續(xù)更新

如果你覺得這些內(nèi)容對(duì)你有幫助,可以掃碼獲?。。。。▊渥ython)

70aad5355a2c5eeff0.png)

既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上前端開發(fā)知識(shí)點(diǎn),真正體系化!

由于文件比較大,這里只是將部分目錄大綱截圖出來,每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會(huì)持續(xù)更新

如果你覺得這些內(nèi)容對(duì)你有幫助,可以掃碼獲?。。。。▊渥ython)

柚子快報(bào)激活碼778899分享:scrapy實(shí)現(xiàn)增量式爬取

http://yzkb.51969.com/

文章來源

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/18960999.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄