成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

爬蟲爬 JSON HTML 數(shù)據(jù)

Hegel_Gu / 1704人閱讀

摘要:最近這兩周在忙著給公司爬一點(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ù),就完事了。

請(qǐng)求數(shù)據(jù) req

一般來(lái)說(shuō)請(qǐng)求分為兩種,拉數(shù)據(jù) get 比較多。
偶爾部分接口需要登錄,那就是多帶 cookie 或者 headers
其實(shí)還有一部分工作就是分析入?yún)?/strong>。

get
參數(shù)拼接在 url

post
參數(shù)放在 body

響應(yīng)數(shù)據(jù) rsp

返回?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ō) PCM 端的進(jìn)度不了,有可能都不是一個(gè)項(xiàng)目組,所以實(shí)現(xiàn)方式就會(huì)有差別。

html
比較坑的一種方式,因?yàn)闆](méi)有找到 JSON 接口。無(wú)奈只能走解析 HTML 的路子。

調(diào)研

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。

scrapy
scrapy 是一個(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 HTML

scrapy 處理器中的 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) 提取屬性

xpath

quote.xpath("span/small/text()").extract_first()
文檔,這個(gè)我不會(huì),我也沒(méi)看

scrapy JSON

import json 使用這個(gè)類庫(kù)解析如:json.loads(response.body.decode("utf-8"))

scrapy 請(qǐng)求方式 get

import 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

相關(guān)文章

  • JSON HTML 數(shù)據(jù)

    摘要:最近這兩周在忙著給公司爬一點(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)那人離職了,有可...

    cocopeak 評(píng)論0 收藏0
  • node.js 取招聘信息分析各職業(yè)錢途(+動(dòng)態(tài)IP代理+數(shù)據(jù)可視化分析)

    摘要:成功爬取了拉鉤網(wǎng)上多個(gè)招聘崗位的具體信息后,數(shù)據(jù)可視化并得出分析結(jié)果如下從整體看,北上廣深杭這五個(gè)城市前端工程師招聘崗位,北京是遙遙領(lǐng)先,是深圳的兩倍,是廣州的三倍,其次到上海,深圳,杭州,廣州居末。 前前言 本文首發(fā)于 github blog 不想看爬蟲過(guò)程只想看職位錢途數(shù)據(jù)分析請(qǐng)看這里:前端招聘崗位分析C++招聘崗位分析JAVA招聘崗位分析PHP招聘崗位分析Python招聘崗位分析...

    546669204 評(píng)論0 收藏0
  • bilibili壁紙站-node

    摘要:前言之前初學(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è)爬蟲,爬...

    sf_wangchong 評(píng)論0 收藏0

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

0條評(píng)論

閱讀需要支付1元查看
<