摘要:最近這兩周在忙著給公司爬一點(diǎn)數(shù)據(jù),更文的速度有一點(diǎn)下降,預(yù)計(jì)今天就爬完了,總結(jié)總結(jié)經(jīng)驗(yàn)。一個(gè)爬蟲的框架?;镜葍r(jià)于選擇其中的文字提取屬性文檔,這個(gè)我不會,我也沒看使用這個(gè)類庫解析如請求方式可以用來給中文字符數(shù)據(jù)放入傳遞即可。
最近這兩周在忙著給公司爬一點(diǎn)數(shù)據(jù),更文的速度有一點(diǎn)下降,預(yù)計(jì)今天就爬完了,總結(jié)總結(jié)經(jīng)驗(yàn)。
其實(shí)之前我司是有專門做爬蟲的,不用前端這邊出人干活。后來那人離職了,有可能就沒有爬蟲這方面的需求了。突然又有了一些,前端這邊出人做一下。老大說用 py 做,前期先調(diào)研一下。
原理爬蟲其實(shí)原理上很簡單,我們==客戶端,他們==服務(wù)端。
客戶端發(fā)送請求 req,服務(wù)端返回響應(yīng) rsp。拿到響應(yīng)之后解析數(shù)據(jù),入庫,就完事了。
一般來說請求分為兩種,拉數(shù)據(jù) get 比較多。
偶爾部分接口需要登錄,那就是多帶 cookie 或者 headers。
其實(shí)還有一部分工作就是分析入?yún)?/strong>。
get
參數(shù)拼接在 url 上
post
參數(shù)放在 body 里
返回?cái)?shù)據(jù)大體上是兩種
JSON
一般來說,通過 抓包 或者說 network 工具。我們找到了服務(wù)端的接口,那么我直接訪問這個(gè)接口即可。
本文第一個(gè)重點(diǎn)來了:切換到移動端再查一遍,往往有不一樣的收獲,一般來說 PC 和 M 端的進(jìn)度不了,有可能都不是一個(gè)項(xiàng)目組,所以實(shí)現(xiàn)方式就會有差別。
html
比較坑的一種方式,因?yàn)闆]有找到 JSON 接口。無奈只能走解析 HTML 的路子。
Node
之前給后臺搭架子的時(shí)候使用過,主要功能點(diǎn)如下:
自動登錄,(拿headers、cookie)
存儲本地,每次請求帶上 token
啟動代理服務(wù)
py 老大說要用這個(gè)東西。咨詢了一下其他朋友,說可以使用下面的工具。
requests + beautifulSoup
使用起來其實(shí)就是 requests 發(fā)請求, beautifulSoup 解析 HTML。比較原始。
scrapy
一個(gè)爬蟲的框架。我在這里學(xué)的 www.scrapyd.cn。實(shí)現(xiàn)上比較完整,可以設(shè)置請求間隔,隨機(jī) ua 等功能。
前端實(shí)現(xiàn)
我一個(gè)鐵頭娃,怎么能輕言放棄?身為一個(gè)前端er,還是這些 api 讓我更加親切
XHR
發(fā)請求利器,打開對方頁面,cookie 啥的都自帶。無敵就是這么寂寞。
其實(shí)還可以找到對方請求發(fā)起的位置,打個(gè)斷點(diǎn),把對方內(nèi)部的代碼綁定到全局,這樣一些內(nèi)部邏輯什么的也都沒問題。
而且還 JSON HTML 通吃。
iframe
針對 HTML 類型的處理。同域的情況下,也無敵好嗎?
HTML 獲取 DOM 節(jié)點(diǎn)?
甚至可以取 window 上的對象。vue SSR 你感覺到了威脅嗎?
網(wǎng)上其他服務(wù)商提供的接口(真香啊)。有免費(fèi)的有收費(fèi)的,一般免費(fèi)的限量。
比如抖音熱度?
比如各類音樂的歌單和作品?
IP 查詢
天氣查詢
好了上面說了那么多,建議老大限制,我選擇了 scrapy。
scrapyscrapy 是一個(gè)網(wǎng)頁爬蟲框架,神馬叫做爬蟲,如果沒聽說過,那就:內(nèi)事不知問度娘,外事不決問谷歌,百度或谷歌一下吧!……(這里的省略號代表 scrapy 很牛逼,基本神馬都能爬,包括你喜歡的蒼老師……這里就不翻譯了)
看到這個(gè)騷的飛起的介紹了嗎?沒錯(cuò),我就是在上面學(xué)的。scrapy 中文站。接下來我就介紹一下我認(rèn)為對于新手比較關(guān)注的東西
scrapy HTMLscrapy 處理器中的 response 標(biāo)識你拿到的 rsp 上面自帶了一些方法,一般來說需要關(guān)注的只有兩個(gè)
css 選擇器quote.css("span.text::text").extract_first() 中的 "span.text::text"眼熟嗎?
沒錯(cuò),就是我們常用的選擇器。通過這個(gè) api,我們可以把我們想要的數(shù)據(jù),限時(shí)在一個(gè)很小的范圍,然后拿字符串即可。
啥?你說你不會 css 選擇器?前端培訓(xùn)-初級階段(5 - 8)-CSS選擇器(基本、層級、屬性、偽類、偽狀態(tài))
extract() 函數(shù)提取列表
extract_first() 代表提取第一個(gè)元素?;镜葍r(jià)于 extract()[0]
::text 選擇其中的文字
::attr(href) 提取屬性
xpathquote.xpath("span/small/text()").extract_first()
文檔,這個(gè)我不會,我也沒看
import json 使用這個(gè)類庫解析如:json.loads(response.body.decode("utf-8"))
scrapy 請求方式 getimport urllib 可以用來給中文字符 encode
yield scrapy.FormRequest( url, method = "GET", headers = self.headers, formdata={}, callback = self.parse_list, dont_filter = True, meta = { "offset": 0, })post
數(shù)據(jù)放入 formdata 傳遞即可。
yield scrapy.FormRequest( url, method = "POST", headers = self.headers, formdata={}, callback = self.parse_list, dont_filter = True, meta = { "offset": 0, })給回調(diào)模塊帶參數(shù)
meta = { "offset": 0, }
如下方式接收
disstid = response.meta["offset"]外部傳參方式
scrapy crawl argsSpider -a tag=愛情
內(nèi)部是使用如下命令可以接收到。
def start_requests(self): url = "http://lab.scrapyd.cn/" tag = getattr(self, "tag", None) # 獲取tag值,也就是爬取時(shí)傳過來的參數(shù)scrapy mysql
大數(shù)據(jù)那邊說爬回來的數(shù)據(jù)要入庫。
scrapyMysql/scrapyMysql/items.py 編寫對應(yīng)入庫字段。
import scrapy class ScrapymysqlItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() tag = scrapy.Field() # 標(biāo)簽字段 cont = scrapy.Field() # 名言內(nèi)容 pass
scrapyMysql/scrapyMysql/spiders/inputMysql.py 寫爬蟲處理操作時(shí),入庫
item = ScrapymysqlItem() # 實(shí)例化item類 for v in mingyan: # 循環(huán)獲取每一條名言里面的:名言內(nèi)容、作者、標(biāo)簽 item["cont"] = v.css(".text::text").extract_first() # 提取名言 tags = v.css(".tags .tag::text").extract() # 提取標(biāo)簽 item["tag"] = ",".join(tags) # 數(shù)組轉(zhuǎn)換為字符串 yield item # 把取到的數(shù)據(jù)提交給pipline處理
編寫MySQL存儲插件:MySQLPipeline.py
import pymysql.cursors class MySQLPipeline(object): def __init__(self): # 連接數(shù)據(jù)庫 self.connect = pymysql.connect( host="127.0.0.1", # 數(shù)據(jù)庫地址 port=3306, # 數(shù)據(jù)庫端口 db="scrapyMysql", # 數(shù)據(jù)庫名 user="root", # 數(shù)據(jù)庫用戶名 passwd="root", # 數(shù)據(jù)庫密碼 charset="utf8", # 編碼方式 use_unicode=True) # 通過cursor執(zhí)行增刪查改 self.cursor = self.connect.cursor() def process_item(self, item, spider): self.cursor.execute( """insert into mingyan(tag, cont) value (%s, %s)""", # 純屬python操作mysql知識,不熟悉請惡補(bǔ) (item["tag"], # item里面定義的字段和表字段對應(yīng) item["cont"],)) # 提交sql語句 self.connect.commit() return item # 必須實(shí)現(xiàn)返回
settings啟動MySQLPipline組件
ITEM_PIPELINES = { "scrapyMysql.MySQLPipline.MySQLPipeline": 300, }總結(jié)一下
到現(xiàn)在,我們已經(jīng)完成了所有基礎(chǔ)知識的積累。遇到不會我們?nèi)ダ锟???br>總結(jié)一下需要注意點(diǎn)的
切換 PC 和 M 端,尋找可行的方案
注意節(jié)制(部分容易限量)
python 編碼問題(真的好煩)
網(wǎng)上提供的那個(gè) mysql 庫和我的不合,我換了一個(gè)MySQLdb
第三方的接口是真香
微信公眾號文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44084.html
摘要:最近這兩周在忙著給公司爬一點(diǎn)數(shù)據(jù),更文的速度有一點(diǎn)下降,預(yù)計(jì)今天就爬完了,總結(jié)總結(jié)經(jīng)驗(yàn)。一個(gè)爬蟲的框架。基本等價(jià)于選擇其中的文字提取屬性文檔,這個(gè)我不會,我也沒看使用這個(gè)類庫解析如請求方式可以用來給中文字符數(shù)據(jù)放入傳遞即可。 最近這兩周在忙著給公司爬一點(diǎn)數(shù)據(jù),更文的速度有一點(diǎn)下降,預(yù)計(jì)今天就爬完了,總結(jié)總結(jié)經(jīng)驗(yàn)。 其實(shí)之前我司是有專門做爬蟲的,不用前端這邊出人干活。后來那人離職了,有可...
摘要:成功爬取了拉鉤網(wǎng)上多個(gè)招聘崗位的具體信息后,數(shù)據(jù)可視化并得出分析結(jié)果如下從整體看,北上廣深杭這五個(gè)城市前端工程師招聘崗位,北京是遙遙領(lǐng)先,是深圳的兩倍,是廣州的三倍,其次到上海,深圳,杭州,廣州居末。 前前言 本文首發(fā)于 github blog 不想看爬蟲過程只想看職位錢途數(shù)據(jù)分析請看這里:前端招聘崗位分析C++招聘崗位分析JAVA招聘崗位分析PHP招聘崗位分析Python招聘崗位分析...
摘要:前言之前初學(xué)的時(shí)候,有用爬蟲爬過一些磁力鏈接詳情見羞羞的爬蟲但是沒有并發(fā),沒有代理,那時(shí)也對異步不是很了解所以這次又寫了個(gè)爬蟲,爬取壁紙站的所有壁紙并且爬取開心代理的條,并將有用的存進(jìn)文件中用到的模塊控制并發(fā)解析庫使用代理讀寫文件其中的具 前言 之前初學(xué)node的時(shí)候,有用爬蟲爬過一些磁力鏈接詳情見羞羞的node爬蟲但是沒有并發(fā),沒有代理,那時(shí)也對異步不是很了解所以這次又寫了個(gè)爬蟲,爬...
閱讀 2830·2021-11-22 15:11
閱讀 3550·2021-09-28 09:43
閱讀 2896·2019-08-30 13:05
閱讀 3438·2019-08-30 11:18
閱讀 1454·2019-08-29 16:34
閱讀 1311·2019-08-29 13:53
閱讀 2916·2019-08-29 11:03
閱讀 1668·2019-08-29 10:57