筆者上篇文章中遺留了一個(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