scrapy爬蟲整理的一些知識點

2021-07-26 02:57:32 字數 2268 閱讀 7365

一:xpath選取某乙個節點的後鄰兄弟節點

//html**片段如下

class="total_comment">123456li>

hello worldli>

li>

href="www.example.com">中國好聲音a>

使用following-sibling::*,它的意思是某個元素後面的全部元素,是乙個list形式返回,當我們的目標是class為total_comment後面的第乙個li元素時:

//li[@class=」total_comment」]/following-sibling::*[1]

你可以使用相對下標來操作和這個元素同級的任何乙個或者全部的後鄰兄弟節點。

二:使用requests訪問json資料操作

在使用scrapy抓取一些動態頁面中,有時候會漏掉一些資料,大多是一些ajax傳遞的值,這個時候我按照正常的scrapy流程,我要麼就再寫乙個parse函式,再往下一層去訪問那個頁面,再將拿到的資料和上一層的彙總,得到乙個完整的items,但是無疑,這樣的方法增加了爬蟲的一層深度,會使得其變得更加低效並且繁瑣,於是我考慮直接在最後的那個parse方法中再構造乙個目標頁面的url(需要自己去找介面,一般來說是xhr中的一些請求,也可能只是正常js執行的請求動作),訪問拿回來的資料再填充到items中。

import requests

url = get_json_url(args....) #根據你找到的介面去設定一些引數,構造目標url

r = requests.get(url)

res = r.json() #返回的是乙個dict,就能直接操作了,用 key - value來操作

三:lambda和map函式的混合使用

在開始我的**中存items值的時候,我使用的是itemloader,從外面的配置檔案中讀取乙個dict final_xpath,final_xpath的key作items的key,value是乙個xpath表示式,通過這樣的**:

//這個final_xpath是從外部讀入的,為了清晰一些直接寫出來了

final_xpath =

item = yourspideritem()

for key in final_xpath.keys():

item.fields[key] = field()

map(lambda x:l.add_xpath(key , x),final_xpath[key])

這樣就能對每個key中的xpath list進行全部的提取,而不需要使用for x in final_xpath[key],簡化了一點**。本人的**自認是很水的,對於靈活運用lambda以及其他py的黑科技還大大有待提高。

四:關於json檔案中的load和loads區分

這個在踩了一些坑之後,還是覺得有必要拿出來提醒一下自己的。

import json

#load是接收的file型別的檔案引數

json.load(open('somefile.json','r'))

#loads接收的已經dumps之後的json資料,也就是encode後的json字串

json.loads(dumps_json)

注意:

1.在load某個open file的時候,要千萬注意,被open的檔案必須是正確的dict格式,並且只能是乙個dict。(注意只能是乙個,多個會報錯)

2.loads接收的引數是在程式中的encoded_json字串,也就是乙個dict被json.dumps() encode之後得到的,這就很難直接拿到了,最好是用json.dumps()處理一下,才能得到loads需要的引數。

//標準格式的json字串如下

a =

json.dumps(a)

>>>out[76]: ''

總結:

load是針對open file的;loads(好記一點:load str)是針對字串(由json dumps而成)。在編寫**中避免錯誤操作,記住這些還是有很多幫助的。

暫時先寫這些了,路途還很長,以後會遇到更多的坑和黑科技,加油。

Redis一些知識整理

如何使用redis做非同步佇列?redis是乙個開源的使用ansi c語言編寫 支援網路 可基於記憶體亦可持久化的日誌型 key value nosql資料庫,並提供多種語言的api。它支援儲存的value包括string 字串 list 鍊錶 set 集合 zset sorted set 有序集合...

網速的一些知識整理

先說單位 回來說網線 我們常見的網線是雙絞線。雙絞線採用了一對互相絕緣的金屬導線互相絞合的方式來抵禦一部分外界電磁波干擾。把兩根絕緣的銅導線按一定密度互相絞在一起,可以降低訊號干擾的程度,每一根導線在傳輸中輻射的電波會被另一根線上發出的電波抵消。雙絞線 的名字也是由此而來。常見的網線 雙絞線 目前最...

scrapy爬蟲實用模版例程 一些規則

乙個臨時scrapy任務,可以實現基本的資料爬蟲,根據需要自行增添爬取網頁內容的模版,有空再完善pipline等更高階的功能。源 和爬房價的 上傳 目錄 乙個例子 建立專案 分析目標網頁 實現spider 執行和資料儲存 例子分析 爬取網頁50頁,每頁20本書,共1000本書的 和名字,了解scra...