集合妙用!對(duì)爬蟲(chóng)url進(jìn)行去重

image.png

筆者上篇文章中遺留了一個(gè)問(wèn)題,那就是關(guān)于url去重的操作。然而,在Python中存在著一種沒(méi)有重復(fù)值的數(shù)據(jù)類(lèi)型,即集合set璃氢。

試想一下狮辽,如果我們使用set來(lái)作為爬蟲(chóng)數(shù)據(jù)的存儲(chǔ)類(lèi)型一也,是不是就可以達(dá)到去重的目的呢?

然而喉脖,我們也都明白集合的特性椰苟,它是不能存儲(chǔ)可變類(lèi)型的(如:list、dict)树叽,所以說(shuō)舆蝴,我們需要將鏈接和標(biāo)題存放到1個(gè)元組中,再向集合中添加,集合便可以依靠本身不可重復(fù)的特性洁仗,進(jìn)行數(shù)據(jù)去重层皱。

引入依賴庫(kù)

import requests
import fake_useragent
from lxml import etree

依然使用requests模塊進(jìn)行頁(yè)面請(qǐng)求,fake_useragent進(jìn)行請(qǐng)求頭的自動(dòng)生成赠潦,與上篇文章不同的是叫胖,本文使用lxml模塊進(jìn)行頁(yè)面解析。

請(qǐng)求連接

首先她奥,聲明2個(gè)全局變量house和num瓮增,house類(lèi)型為set,num類(lèi)型為int哩俭。

house = set()
num = 1

然后開(kāi)始對(duì)接口進(jìn)行請(qǐng)求绷跑。

# 初始頁(yè)碼
page = 0

# 循環(huán)請(qǐng)求頁(yè)面
while True:
    response = requests.get(
        url=url.format(page),
        headers=headers,
        proxies=proxies
    )
    
    page += 1

    # 將html轉(zhuǎn)化為可用xpath解析的對(duì)象
    tree = etree.HTML(response.text)
    # 解析并展示數(shù)據(jù)
    parse_and_show(tree)

    # num長(zhǎng)度大于1000,代表已經(jīng)爬取了1000條數(shù)據(jù)
    if num > 1000:
        break

關(guān)于接口的排查過(guò)程以及請(qǐng)求頭的配置可參考筆者的上篇文章携茂。

解析并展示數(shù)據(jù)

此處解析數(shù)據(jù)你踩,筆者選擇的是通過(guò)lxml模塊,即xpath語(yǔ)法進(jìn)行頁(yè)面解析讳苦。當(dāng)然带膜,使用re或者bs4模塊等也是可以的。

def parse_and_show(tree):
    """
    解析展示頁(yè)面
    :param tree: xpath對(duì)象
    :return: None
    """
    global num

    title = tree.xpath('//div[@id="list-container"]/ul/li/div[@class="content"]/a[@class="title"]/text()')
    href = tree.xpath('//div[@id="list-container"]/ul/li/div[@class="content"]/a[@class="title"]/@href')
    link = ['http://www.reibang.com' + i for i in href]
    # 將鏈接與標(biāo)題打包為元組
    link_and_title = zip(link, title)
    for i in link_and_title:
        # 計(jì)算當(dāng)前集合中的數(shù)據(jù)數(shù)量
        count = len(house)
        # 向集合中添加數(shù)據(jù)
        house.add(i)
        # 有新的數(shù)據(jù)添加到集合中
        if len(house) > count:
            print(f'{num}:{i}')
            num += 1
            if num > 1000:
                break

結(jié)語(yǔ)

意外的發(fā)現(xiàn)使用集合進(jìn)行數(shù)據(jù)去重還蠻簡(jiǎn)單的鸳谜,本來(lái)本文是要介紹并使用redis的集合進(jìn)行數(shù)據(jù)去重的膝藕,但突發(fā)奇想試了一下Python中的set,也還蠻好用的咐扭。

使用redis的集合也是很不錯(cuò)的選擇芭挽,畢竟上述開(kāi)發(fā)中數(shù)據(jù)都是展示在終端中的,如果要保存到本地文件或者數(shù)據(jù)庫(kù)的話蝗肪,redis會(huì)更適用一些袜爪。并且,redis能做到的不止是去重薛闪,它最常用的便是用于開(kāi)發(fā)分布式爬蟲(chóng)辛馆。

關(guān)于使用redis進(jìn)行爬蟲(chóng)程序開(kāi)發(fā),筆者將在下篇文章中講解(下次一定)豁延。

關(guān)于本文的完整代碼可參考下方GitHub鏈接昙篙。

https://github.com/macxin123/spider/blob/master/jianshu/set_jianshu.py

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诱咏,隨后出現(xiàn)的幾起案子苔可,更是在濱河造成了極大的恐慌,老刑警劉巖袋狞,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焚辅,死亡現(xiàn)場(chǎng)離奇詭異映屋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)同蜻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)秧荆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人埃仪,你說(shuō)我怎么就攤上這事∩略撸” “怎么了卵蛉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)么库。 經(jīng)常有香客問(wèn)我傻丝,道長(zhǎng),這世上最難降的妖魔是什么诉儒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任葡缰,我火速辦了婚禮,結(jié)果婚禮上忱反,老公的妹妹穿的比我還像新娘泛释。我一直安慰自己,他們只是感情好温算,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布怜校。 她就那樣靜靜地躺著,像睡著了一般注竿。 火紅的嫁衣襯著肌膚如雪茄茁。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天巩割,我揣著相機(jī)與錄音裙顽,去河邊找鬼。 笑死宣谈,一個(gè)胖子當(dāng)著我的面吹牛愈犹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒲祈,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼甘萧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了梆掸?” 一聲冷哼從身側(cè)響起扬卷,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酸钦,沒(méi)想到半個(gè)月后怪得,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年徒恋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚕断。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡入挣,死狀恐怖亿乳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情径筏,我是刑警寧澤葛假,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站滋恬,受9級(jí)特大地震影響聊训,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恢氯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一带斑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧勋拟,春花似錦勋磕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至醋安,卻和暖如春杂彭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吓揪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工亲怠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柠辞。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓团秽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親叭首。 傳聞我的和親對(duì)象是個(gè)殘疾皇子习勤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351