成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

談?wù)剬ython爬蟲的理解

Yang_River / 2139人閱讀

摘要:爬蟲也可以稱為爬蟲不知從何時(shí)起,這門語言和爬蟲就像一對戀人,二者如膠似漆,形影不離,你中有我我中有你,一提起爬蟲,就會想到,一說起,就會想到人工智能和爬蟲所以,一般說爬蟲的時(shí)候,大部分程序員潛意識里都會聯(lián)想為爬蟲,為什么會這樣,我覺得有兩個(gè)

爬蟲也可以稱為Python爬蟲

不知從何時(shí)起,Python這門語言和爬蟲就像一對戀人,二者如膠似漆 ,形影不離,你中有我、我中有你,一提起爬蟲,就會想到Python,一說起Python,就會想到人工智能……和爬蟲

所以,一般說爬蟲的時(shí)候,大部分程序員潛意識里都會聯(lián)想為Python爬蟲,為什么會這樣,我覺得有兩個(gè)原因:

Python生態(tài)極其豐富,諸如Request、Beautiful Soup、Scrapy、PySpider等第三方庫實(shí)在強(qiáng)大

Python語法簡潔易上手,分分鐘就能寫出一個(gè)爬蟲(有人吐槽Python慢,但是爬蟲的瓶頸和語言關(guān)系不大)

任何一個(gè)學(xué)習(xí)Python的程序員,應(yīng)該都或多或少地見過甚至研究過爬蟲,我當(dāng)時(shí)寫Python的目的就非常純粹——為了寫爬蟲。所以本文的目的很簡單,就是說說我個(gè)人對Python爬蟲的理解與實(shí)踐,作為一名程序員,我覺得了解一下爬蟲的相關(guān)知識對你只有好處,所以讀完這篇文章后,如果能對你有幫助,那便再好不過

什么是爬蟲

爬蟲是一個(gè)程序,這個(gè)程序的目的就是為了抓取萬維網(wǎng)信息資源,比如你日常使用的谷歌等搜索引擎,搜索結(jié)果就全都依賴爬蟲來定時(shí)獲取

看上述搜索結(jié)果,除了wiki相關(guān)介紹外,爬蟲有關(guān)的搜索結(jié)果全都帶上了Python,前人說Python爬蟲,現(xiàn)在看來果然誠不欺我~

爬蟲的目標(biāo)對象也很豐富,不論是文字、圖片、視頻,任何結(jié)構(gòu)化非結(jié)構(gòu)化的數(shù)據(jù)爬蟲都可以爬取,爬蟲經(jīng)過發(fā)展,也衍生出了各種爬蟲類型:

通用網(wǎng)絡(luò)爬蟲:爬取對象從一些種子 URL 擴(kuò)充到整個(gè) Web,搜索引擎干的就是這些事

垂直網(wǎng)絡(luò)爬蟲:針對特定領(lǐng)域主題進(jìn)行爬取,比如專門爬取小說目錄以及章節(jié)的垂直爬蟲

增量網(wǎng)絡(luò)爬蟲:對已經(jīng)抓取的網(wǎng)頁進(jìn)行實(shí)時(shí)更新

深層網(wǎng)絡(luò)爬蟲:爬取一些需要用戶提交關(guān)鍵詞才能獲得的 Web 頁面

不想說這些大方向的概念,讓我們以一個(gè)獲取網(wǎng)頁內(nèi)容為例,從爬蟲技術(shù)本身出發(fā),來說說網(wǎng)頁爬蟲,步驟如下:

模擬請求網(wǎng)頁資源

從HTML提取目標(biāo)元素

數(shù)據(jù)持久化

什么是爬蟲,這就是爬蟲:

"""讓我們根據(jù)上面說的步驟來完成一個(gè)簡單的爬蟲程序"""
import requests

from bs4 import BeautifulSoup

target_url = "http://www.baidu.com/s?wd=爬蟲"

# 第一步 發(fā)起一個(gè)GET請求
res = requests.get(target_url)

# 第二步 提取HTML并解析想獲取的數(shù)據(jù) 比如獲取 title
soup = BeautifulSoup(res.text, "lxml")
# 輸出 soup.title.text
title = soup.title.text

# 第三步 持久化 比如保存到本地
with open("title.txt", "w") as fp:
    fp.write(title)

加上注釋不到20行代碼,你就完成了一個(gè)爬蟲,簡單吧

怎么寫爬蟲

網(wǎng)頁世界多姿多彩、億萬網(wǎng)頁資源供你選擇,面對不同的頁面,怎么使自己編寫的爬蟲程序夠穩(wěn)健、持久,這是一個(gè)值得討論的問題

俗話說,磨刀不誤砍柴工,在開始編寫爬蟲之前,很有必要掌握一些基本知識:

網(wǎng)頁的結(jié)構(gòu)是HTML,爬蟲的目標(biāo)就是解析HTML,獲取目標(biāo)字段并保存

客戶端展現(xiàn)的網(wǎng)頁由瀏覽器渲染,客戶端和服務(wù)端的信息交互依靠HTTP協(xié)議

這兩句描述體現(xiàn)了一名爬蟲開發(fā)人員需要掌握的基本知識,不過一名基本的后端或者前端工程師都會這些哈哈,這也說明了爬蟲的入門難度極低,從這兩句話,你能思考出哪些爬蟲必備的知識點(diǎn)呢?

基本的HTML知識,了解HTML才方便目標(biāo)信息提取

基本的JS知識 ,JS可以異步加載HTML

了解CSS Selector、XPath以及正則,目的是為了提取數(shù)據(jù)

了解HTTP協(xié)議,為后面的反爬蟲斗爭打下基礎(chǔ)

了解基本的數(shù)據(jù)庫操作,為了數(shù)據(jù)持久化

有了這些知識儲備,接下來就可以選擇一門語言,開始編寫自己的爬蟲程序了,還是按照上一節(jié)說的三個(gè)步驟,然后以Python為例,說一說要在編程語言方面做那些準(zhǔn)備:

網(wǎng)頁請求:內(nèi)置有urllib庫,第三方庫的話,同步請求可以使用requests,異步請求使用aiohttp

分析HTML結(jié)構(gòu)并提取目標(biāo)元素:CSS Selector和XPath是目前主流的提取方式,第三方庫可以使用Beautiful Soup或者PyQuery

數(shù)據(jù)持久化:目標(biāo)數(shù)據(jù)提取之后,可以將數(shù)據(jù)保存到數(shù)據(jù)庫中進(jìn)行持久化,MySQL、MongoDB等,這些都有對應(yīng)的庫支持,當(dāng)然你也可以保存在硬盤,誰硬盤沒點(diǎn)東西對吧(滑稽臉)

掌握了上面這些,你大可放開手腳大干一場,萬維網(wǎng)就是你的名利場,去吧~

我覺得對于一個(gè)目標(biāo)網(wǎng)站的網(wǎng)頁,可以分下面四個(gè)類型:

單頁面單目標(biāo)

單頁面多目標(biāo)

多頁面單目標(biāo)

多頁面多目標(biāo)

具體是什么意思呢,可能看起來有點(diǎn)繞,但明白這些,你之后寫爬蟲,只要在腦子里面過一遍著網(wǎng)頁對應(yīng)什么類型,然后套上對應(yīng)類型的程序(寫多了都應(yīng)該有一套自己的常用代碼庫),那寫爬蟲的速度,自然不會慢

單頁面單目標(biāo)

通俗來說,就是在這個(gè)網(wǎng)頁里面,我們的目標(biāo)就只有一個(gè),假設(shè)我們的需求是抓取這部 電影-肖申克的救贖 的名稱,首先打開網(wǎng)頁右鍵審查元素,找到電影名稱對應(yīng)的元素位置,如下圖所示:

在某個(gè)單一頁面內(nèi),看目標(biāo)是不是只有一個(gè),一眼就能看出標(biāo)題的CSS Selector規(guī)則為:#content > h1 > span:nth-child(1),然后用我自己寫的常用庫,我用不到十行代碼就能寫完抓取這個(gè)頁面電影名稱的爬蟲:

import asyncio

from ruia import Item, TextField

class DoubanItem(Item):
    title = TextField(css_select="#content > h1 > span:nth-child(1)")

async_func = DoubanItem.get_item(url="https://movie.douban.com/subject/1292052/")
item = asyncio.get_event_loop().run_until_complete(async_func)
print(item.title)

多頁面多目標(biāo)就是此情況下多個(gè)url的衍生情況

單頁面多目標(biāo)

假設(shè)現(xiàn)在的需求是抓取 豆瓣電影250 第一頁中的所有電影名稱,你需要提取25個(gè)電影名稱,因?yàn)檫@個(gè)目標(biāo)頁的目標(biāo)數(shù)據(jù)是多個(gè)item的,因此目標(biāo)需要循環(huán)獲取,這就是所謂的單頁面多目標(biāo)了:

import asyncio

from ruia import Item, TextField

class DoubanItem(Item):
    target_item = TextField(css_select="div.item")
    title = TextField(css_select="span.title")

    async def clean_title(self, title):
        if isinstance(title, str):
            return title
        else:
            return "".join([i.text.strip().replace("xa0", "") for i in title])


async_func = DoubanItem.get_items(url="https://movie.douban.com/top250")
items = asyncio.get_event_loop().run_until_complete(async_func)
for item in items:
    print(item)
多頁面多目標(biāo)

多頁面多目標(biāo)是上述單頁面多目標(biāo)情況的衍生,在這個(gè)問題上來看,此時(shí)就是獲取所有分頁的電影名稱

from ruia import TextField, Item, Request, Spider


class DoubanItem(Item):
    """
    定義爬蟲的目標(biāo)字段
    """
    target_item = TextField(css_select="div.item")
    title = TextField(css_select="span.title")

    async def clean_title(self, title):
        if isinstance(title, str):
            return title
        else:
            return "".join([i.text.strip().replace("xa0", "") for i in title])


class DoubanSpider(Spider):
    start_urls = ["https://movie.douban.com/top250"]
    concurrency = 10

    async def parse(self, res):
        etree = res.html_etree
        pages = ["?start=0&filter="] + [i.get("href") for i in etree.cssselect(".paginator>a")]

        for index, page in enumerate(pages):
            url = self.start_urls[0] + page
            yield Request(
                url,
                callback=self.parse_item,
                metadata={"index": index},
                request_config=self.request_config
            )

    async def parse_item(self, res):
        items_data = await DoubanItem.get_items(html=res.html)
        res_list = []
        for item in items_data:
            res_list.append(item.title)
        return res_list


if __name__ == "__main__":
    DoubanSpider.start()

如果網(wǎng)絡(luò)沒問題的話,會得到如下輸出:

注意爬蟲運(yùn)行時(shí)間,1s不到,這就是異步的魅力

用Python寫爬蟲,就是這么簡單優(yōu)雅,諸位,看著網(wǎng)頁就思考下:

是什么類型的目標(biāo)類型

用什么庫模擬請求

怎么解析目標(biāo)字段

怎么存儲

一個(gè)爬蟲程序就成型了,順便一提,爬蟲這東西,可以說是防君子不防小人,robots.txt大部分網(wǎng)站都有(它的目的是告訴爬蟲什么可以爬取什么不可以爬取,比如:https://www.baidu.com/robots.txt),各位想怎么爬取,自己衡量

如何進(jìn)階

不要以為寫好一個(gè)爬蟲程序就可以出師了,此時(shí)還有更多的問題在前面等著你,你要含情脈脈地看著你的爬蟲程序,問自己三個(gè)問題:

爬蟲抓取數(shù)據(jù)后是正當(dāng)用途么?

爬蟲會把目標(biāo)網(wǎng)站干掉么?

爬蟲會被反爬蟲干掉么?

前兩個(gè)關(guān)于人性的問題在此不做過多敘述,因此跳過,但你們?nèi)绻鳛榕老x工程師的話,切不可跳過

會被反爬蟲干掉么?

最后關(guān)于反爬蟲的問題才是你爬蟲程序強(qiáng)壯與否的關(guān)鍵因素,什么是反爬蟲?

當(dāng)越來越多的爬蟲在互聯(lián)網(wǎng)上橫沖直撞后,網(wǎng)頁資源維護(hù)者為了防止自身數(shù)據(jù)被抓取,開始進(jìn)行一系列的措施來使得自身數(shù)據(jù)不易被別的程序爬取,這些措施就是反爬蟲

比如檢測IP訪問頻率、資源訪問速度、鏈接是否帶有關(guān)鍵參數(shù)、驗(yàn)證碼檢測機(jī)器人、ajax混淆、js加密等等

對于目前市場上的反爬蟲,爬蟲工程師常有的反反爬蟲方案是下面這樣的:

不斷試探目標(biāo)底線,試出單IP下最優(yōu)的訪問頻率

構(gòu)建自己的IP代理池

維護(hù)一份自己常用的UA庫

針對目標(biāo)網(wǎng)頁的Cookie池

需要JS渲染的網(wǎng)頁使用無頭瀏覽器進(jìn)行代碼渲染再抓取

一套破解驗(yàn)證碼程序

扎實(shí)的JS知識來破解混淆函數(shù)

爬蟲工程師的進(jìn)階之路其實(shí)就是不斷反反爬蟲,可謂艱辛,但換個(gè)角度想也是樂趣所在

關(guān)于框架

爬蟲有自己的編寫流程和標(biāo)準(zhǔn),有了標(biāo)準(zhǔn),自然就有了框架,像Python這種生態(tài)強(qiáng)大的語言,框架自然是多不勝數(shù),目前世面上用的比較多的有:

Scrapy

PySpider

Portia

這里不過多介紹,框架只是工具,是一種提升效率的方式,看你選擇

說明

任何事物都有兩面性,爬蟲自然也不例外,因此我送諸位一張圖,關(guān)鍵時(shí)刻好好想想

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42963.html

相關(guān)文章

  • 如何實(shí)現(xiàn)一個(gè)Python爬蟲框架

    摘要:這篇文章的題目有點(diǎn)大,但這并不是說我自覺對爬蟲這塊有多大見解,我只不過是想將自己的一些經(jīng)驗(yàn)付諸于筆,對于如何寫一個(gè)爬蟲框架,我想一步一步地結(jié)合具體代碼來講述如何從零開始編寫一個(gè)自己的爬蟲框架年到如今,我花精力比較多的一個(gè)開源項(xiàng)目算是了,這是 showImg(https://segmentfault.com/img/remote/1460000018513379); 這篇文章的題目有點(diǎn)大...

    feng409 評論0 收藏0
  • Python 爬蟲面試題 170 道:2019 版

    摘要:下面代碼會存在什么問題,如何改進(jìn)一行代碼輸出之間的所有偶數(shù)。簡述進(jìn)程之間如何通信多路復(fù)用的作用模型的區(qū)別什么是并發(fā)和并行解釋什么是異步非阻塞的作用面試題說說你知道的命令如何查看某次提交修改的內(nèi)容答案掃碼下面的二維碼訂閱即可獲取。 引言 最近在刷面試題,所以需要看大量的 Python 相關(guān)的面試題,從大量的題目中總結(jié)了很多的知識,同時(shí)也對一些題目進(jìn)行拓展了,但是在看了網(wǎng)上的大部分面試題不...

    trigkit4 評論0 收藏0
  • 一個(gè)初學(xué)編程草根大叔用了一個(gè)月時(shí)間沖上周榜第二名!給想沖榜后浪們談?wù)?/em>小經(jīng)驗(yàn)——

    摘要:今晨起來翻了翻排行榜,發(fā)現(xiàn)前天發(fā)的文章早已被擠出全站熱榜,但卻意外發(fā)現(xiàn)自己已經(jīng)站上了作者周榜的亞軍寶座。作為一個(gè)草根初習(xí)者一個(gè)月沖上周榜亞軍實(shí)屬不易,也不是我刻意準(zhǔn)備想沖榜而全是意外。 今晨起來翻了翻CDSN排行榜,發(fā)現(xiàn)前天發(fā)的文章早已被擠出全站熱榜,但卻意外發(fā)現(xiàn)自己已經(jīng)站上了作者周榜的亞軍...

    _ivan 評論0 收藏0
  • 關(guān)于個(gè)人第一天前端面試面試問答QA,希望能其他找前端工作朋友有所幫助。

    摘要:兩日前,發(fā)了一篇吐槽,莫名的火了一把。關(guān)于的第一個(gè),其實(shí)就是聲明一個(gè)常量,不允許變更。另外對象迭代這里出自,阮一峰大神寫的入門指南,對象篇。 兩日前,發(fā)了一篇吐槽,莫名的火了一把。經(jīng)過大家的建議與鼓勵(lì),于是修改了簡歷,開始了重新投遞,2天后接到第一份面試邀請。 此文為個(gè)人面試經(jīng)歷,QA問答過程與總結(jié),不透露面試公司及面試人員,內(nèi)容真實(shí),如果有面試過我的大佬看到博客,歡迎指出問題。 循序...

    Youngdze 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<