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