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