国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Scrapy的微博爬蟲設(shè)計(jì)

2018-02-28 11:25:32張安啟羅批
電子技術(shù)與軟件工程 2018年13期
關(guān)鍵詞:爬蟲微博

張安啟 羅批

摘要 新浪微博是數(shù)據(jù)的重要發(fā)源地。為實(shí)現(xiàn)數(shù)據(jù)快速抓取,本文在研究反爬機(jī)制的基礎(chǔ)上,設(shè)計(jì)了基于Scrapy的微博爬蟲,并對(duì)各模塊進(jìn)行了詳細(xì)闡述。實(shí)驗(yàn)表明,該爬蟲具有支持關(guān)鍵字匹配、速度快、簡(jiǎn)單的特點(diǎn)。為研究者提供了快速、準(zhǔn)確、方便地獲取微博數(shù)據(jù)的途徑。

【關(guān)鍵詞】Scrapy 爬蟲 微博

微博自誕生之日起就獲得迅猛發(fā)展。截至2017年9月,新浪微博的活躍用戶高達(dá)3.76億,較之去年同期增長(zhǎng)27%。微博作為網(wǎng)民交流互動(dòng)的平臺(tái),時(shí)刻產(chǎn)生著大量的數(shù)據(jù),對(duì)于研究具有重要意義。當(dāng)前通過(guò)微博開放接口(API)獲取數(shù)據(jù)存在諸多的限制,而且流程復(fù)雜、速度較慢。

Sctapy是為爬取網(wǎng)絡(luò)結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架,具有簡(jiǎn)單、模塊清晰的特點(diǎn)。Scrapy框架對(duì)于設(shè)計(jì)爬取新浪微博數(shù)據(jù)的爬蟲具有十分重要的意義。本文研究了當(dāng)前微博的反爬機(jī)制,并對(duì)該機(jī)制制定了相應(yīng)的策略。并依此設(shè)計(jì)了基于Scrapy的微博爬蟲。并通過(guò)實(shí)驗(yàn)驗(yàn)證了設(shè)計(jì)的爬蟲的有效性。

1 當(dāng)前的反爬蟲機(jī)制

當(dāng)前的反爬機(jī)制主要有以下四種:

(1) IP地址的限制。微博服務(wù)器對(duì)登錄網(wǎng)站的IP地址進(jìn)行監(jiān)測(cè),如果某一個(gè)IP地址訪問(wèn)頻率過(guò)高或者持續(xù)時(shí)間過(guò)久,就會(huì)判定使用該IP的用戶為爬蟲并對(duì)該IP進(jìn)行封鎖。令其無(wú)法訪問(wèn)微博或者通過(guò)驗(yàn)證后方可進(jìn)行訪問(wèn)。

(2)瀏覽器的限制。瀏覽器的標(biāo)識(shí)存在于headers屬性當(dāng)中。如果檢測(cè)到某一個(gè)瀏覽器頻繁地訪問(wèn),便會(huì)封殺該瀏覽器。

(3)對(duì)賬號(hào)的限制。因?yàn)橐粋€(gè)人不可能頻繁大量長(zhǎng)時(shí)間地訪問(wèn)微博,因此如果某一賬號(hào)頻繁不間斷的訪問(wèn)微博,該賬號(hào)就需要重新驗(yàn)證方可繼續(xù)訪問(wèn)。

(4)對(duì)訪問(wèn)頻率的限制。由于爬蟲瀏覽速率非??欤哂谄胀ㄈ藶g覽網(wǎng)頁(yè)的幾十倍甚至上百倍。因此,如果訪問(wèn)頻率過(guò)高,也會(huì)將其判定為爬蟲,對(duì)其要求進(jìn)行驗(yàn)證。

由此可見,當(dāng)前的反爬機(jī)制主要是通過(guò)對(duì)正常網(wǎng)民行為進(jìn)行識(shí)別。當(dāng)某個(gè)網(wǎng)民的行為與正常網(wǎng)民的行為不一致的時(shí)候,就會(huì)判定該網(wǎng)民為爬蟲。因此,為了應(yīng)對(duì)反爬蟲機(jī)制,就應(yīng)該讓爬蟲行為與正常用戶行為更為相似。

2 應(yīng)對(duì)反爬蟲的策略

針對(duì)微博的反爬蟲策略,在此制定防止反爬蟲的設(shè)計(jì)。

(1)建立由多個(gè)IP地址組成的IP池。每進(jìn)行一次新的頁(yè)面訪問(wèn),從IP池中隨機(jī)抽取一個(gè)IP地址。這樣可以避免某個(gè)IP地址被封殺。

(2)建立多個(gè)移動(dòng)瀏覽器標(biāo)識(shí)的客戶端類型池。由于當(dāng)前人們習(xí)慣于使用手機(jī)等移動(dòng)設(shè)備上網(wǎng),因而使用移動(dòng)設(shè)備瀏覽器登錄網(wǎng)站理論上講是個(gè)較為安全的方式。從移動(dòng)客戶端類型池中每次隨機(jī)抽取一個(gè)客戶端,模擬網(wǎng)民登陸。

(3)建立多個(gè)賬號(hào)組成的賬號(hào)池。每次訪問(wèn)新的頁(yè)面,從賬號(hào)池中隨機(jī)抽取一個(gè)賬號(hào),有效降低單個(gè)賬號(hào)的訪問(wèn)頻率。

(4)增大訪問(wèn)時(shí)延。通過(guò)增大訪問(wèn)時(shí)延,降低訪問(wèn)頻率,模擬正常人的訪問(wèn),實(shí)現(xiàn)對(duì)反爬蟲機(jī)制的回避。

3 基于Scrapy的爬蟲工作原理

圖1是Scrapy框架圖,現(xiàn)在對(duì)其各個(gè)模塊以及運(yùn)行流程進(jìn)行介紹。

3.1 模塊介紹

引擎( Scrapy Engine):它是整個(gè)框架的核心,數(shù)據(jù)在各個(gè)模塊的流動(dòng)都需要通過(guò)引擎的牽引來(lái)實(shí)現(xiàn)。

調(diào)度器(Schedule)接受引擎模塊發(fā)來(lái)的request,并將request壓入隊(duì)列。在進(jìn)行微博抓取的時(shí)候主要是URL隊(duì)列。調(diào)度器對(duì)URL隊(duì)列進(jìn)行處理,主要是排序與去重。

下載器(Downloader):從互聯(lián)網(wǎng)上獲取數(shù)據(jù),并將內(nèi)容反饋給爬蟲( Spiders)模塊。

管道(Pipelines):處理從網(wǎng)頁(yè)中抽取的實(shí)體(Items),主要功能是驗(yàn)證實(shí)體有效性和清除無(wú)意義的信息。頁(yè)面被解析后,將會(huì)被發(fā)送到管道中進(jìn)行處理。本實(shí)驗(yàn)結(jié)合Mongodb數(shù)據(jù)庫(kù),通過(guò)Pipelines將數(shù)據(jù)直接導(dǎo)入Mongodb數(shù)據(jù)庫(kù)中。

中間件(Middlewares):處理兩個(gè)模塊之間的信息請(qǐng)求以及進(jìn)行相應(yīng)。

3.2 運(yùn)行流程

引擎將調(diào)度器里的URL封裝成請(qǐng)求( Requests),傳送到下載器,下載器從互聯(lián)網(wǎng)上將數(shù)據(jù)下載下來(lái),將其封裝成應(yīng)答包( Responses)并傳送給爬蟲。爬蟲對(duì)應(yīng)答包進(jìn)行解析得到實(shí)體或URL。如果是實(shí)體,則交給管道進(jìn)行進(jìn)一步處理。如果是URL,則將結(jié)果交給調(diào)度器處理。

4 爬蟲的各個(gè)模塊設(shè)計(jì)

4.1 Cookies模塊

Cookies模塊主要用于在一定時(shí)間內(nèi),記錄登錄數(shù)據(jù),在進(jìn)行登錄的時(shí)候可以保持登錄的狀態(tài)。在本文設(shè)計(jì)的cookies模塊中,記錄的是多個(gè)用戶賬號(hào)組成的賬號(hào)池,用來(lái)登陸微博網(wǎng)站時(shí)先切換賬號(hào)。主要偽代碼如下:

weib0 =[{num‘:‘1 5022967940,psw:OC3LKP'),……]#建立微博賬號(hào)池,賬號(hào)池中的賬號(hào)越多,被封殺的可能性越低,時(shí)延可以設(shè)置越低,爬取速度越快

def getCookies(、veibo):#獲取Cookies

cookies =[]

loginURL= 'https:,//weibo.cn/login/'#微博網(wǎng)站登陸界面

for elem in weibo:#從微博賬號(hào)池中抽取一個(gè)賬號(hào)進(jìn)行登錄

account= elem[num]

password = elem[psw‘]

try:

browser= webdriver.PhantomjS(desiredcapabilities=dcap) browser.get(loginURL)

if出現(xiàn)需要識(shí)別的代碼

人工識(shí)別代碼并在界面上輸入代碼

4.2 Items模塊

該模塊主要明確抓取數(shù)據(jù)的類型。本文抓取的實(shí)驗(yàn)數(shù)據(jù)類型是用戶的用戶名,用戶粉絲數(shù)、微博內(nèi)容、發(fā)布時(shí)間、轉(zhuǎn)發(fā)數(shù)、點(diǎn)贊數(shù)以及評(píng)論數(shù)三個(gè)指標(biāo)。其主要代碼為:

from scrapy import Item, Field

class Informationltem(ltem):#個(gè)人信息

id= Field()#用戶ID

Fans= Field()#用戶粉絲

Content= Field()#微博內(nèi)容

PubTime= Field()#發(fā)表時(shí)間

Transfer= Field()#轉(zhuǎn)發(fā)數(shù)

Like= Field()#點(diǎn)贊數(shù)

Comment= Field()#評(píng)論數(shù)

4.3 Middlewares模塊

該模塊主要實(shí)現(xiàn)瀏覽器、IP地址以及登陸賬號(hào)(登陸賬號(hào)在cookies中)的轉(zhuǎn)換,防止被禁止爬取數(shù)據(jù)。其主要代碼如下:

import random

import urlllib.request

from cookies import cookies

agents=["Mozilla/5.0 (Linux; U;Android 2.3.6; en-us; Nexus S Build/GRK39F)AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 Mobile Safari/533.1”,—…]#建立移動(dòng)瀏覽器池

ips= [23.25.35.66,….]#建立ip地址池

class UserAgentIPMiddleware(object): #更換User-Agent與IP

def process_request(self, request, spider):

agent= random.choice(agents)#從移動(dòng)瀏覽器池中隨機(jī)抽取一個(gè)移動(dòng)瀏覽器

ip= random.choice(ips)#從IP池中隨機(jī)抽取IP

request.headers["User-Agent"]= agenr##訪問(wèn)網(wǎng)站的瀏覽器頭設(shè)置為抽取的移動(dòng)瀏覽器

ip_support=urllib.requestProxyHandler({ thttp':ip})

opener= urllib.request.build_opener(ipsupport)

urllib.request.install_opener(opener)

class CookiesMiddleware(object):#更 換Cookie

def process_request(self, request, spider):

cookie= random.choice(cookies)#從cookies池中隨機(jī)抽取cookie

request.cookies= cookie

4.4 Pipelines模塊

該模塊主要對(duì)抓取的數(shù)據(jù)進(jìn)行解析校對(duì),然后傳入Mongodb數(shù)據(jù)庫(kù)中。其主要代碼如下:

import pymongo

fromltems import Informationltem

class MongoDBPipleline(object):#初始化設(shè)置MongoDB數(shù)據(jù)庫(kù)

defjnit_(selt):

clinet= pymongo.MongoClient("localhost",27017)

db = clinet["Sina"]

selflnformation= db["Information"]

def processjtem(selt item, spider):#判斷item的類型,并作相應(yīng)的處理,再入數(shù)據(jù)庫(kù)

ifisinstance(item, Informationltem):

try:

self.lnformation.insert(dict(item》

except Exception:

pass

retumltem

4.5 Settings模塊

該模塊主要設(shè)置抓取的間隔時(shí)間與關(guān)鍵詞等信息。在這設(shè)置抓取間隔為6,關(guān)鍵詞為租賃房。主要代碼如下:

DOWNLOAD__ DELAY=6井間隔時(shí)間

KEY WORD=‘租賃房#關(guān)鍵詞

4.6 Spider主程序(引擎模塊)

該模塊是整個(gè)程序的核心,通過(guò)該模塊實(shí)現(xiàn)數(shù)據(jù)的抓取。主要代碼如下:

def start_requests(self):#依據(jù)關(guān)鍵詞獲取微博,并將該微博的用戶的地址url

url={url} ?keyword= {keyword}format(url=self.search_url, keyword=KEYWORD)

# search url為微博搜索界面

defparse (self, response):#抓取微博數(shù)據(jù)

selector= Selector(response)

rweets=selector.xpath(body/div[@class='c”and@idD

for tweet in tweets:

nveetsltems= Tweetsltem()

id= tweet.xpath(@id').extract_first()#獲取微博ID

fans= response.xpath(”//div[@class=tip2]/a[contains(text(),‘粉絲[)]/text()”)#獲取粉絲

content= tweet.xpath(‘div/span[@class=”ctt”]/text()).extract_first()#獲取微博內(nèi)容

like= re.findall(u\u8d5e\[(\d+)、],tweet.extract(》#獲取點(diǎn)贊數(shù)

transfer= re.findall(u‘\u8f6c\u53d1、[(\d_)m tweet.extracr(》#獲取轉(zhuǎn)載數(shù)

comment= re.findall(u‘\u8bc4\u8bba、[(\d+)m tweet.extract(》#獲取評(píng)論數(shù)5實(shí)驗(yàn)運(yùn)行平臺(tái)

實(shí)驗(yàn)平臺(tái):聯(lián)想E431電腦

具體配置:CPU intel i5-4320、8G內(nèi)存、2G顯卡、256G固態(tài)硬盤

6 實(shí)驗(yàn)分析

本實(shí)驗(yàn)以群眾最為關(guān)心的租賃房作為關(guān)鍵詞進(jìn)行數(shù)據(jù)的抓取,在爬蟲運(yùn)行的86小時(shí)23分鐘內(nèi),共計(jì)爬取了9910個(gè)用戶的18633554條數(shù)據(jù)。

圖2是爬取的部分?jǐn)?shù)據(jù)截圖:從左到右為用戶名、粉絲數(shù)、微博內(nèi)容、轉(zhuǎn)發(fā)數(shù)、點(diǎn)贊數(shù)、評(píng)論數(shù)及發(fā)布時(shí)間。

依據(jù)粉絲數(shù)多少繪制用戶的累計(jì)分布概率進(jìn)行繪制,得到的結(jié)果如圖3所示。

這說(shuō)明關(guān)于“租賃房”這一社會(huì)熱點(diǎn)話題的參與者的粉絲呈冪率分布,關(guān)心該話題的大部分人為擁有少量粉絲的普通民眾。這也與當(dāng)前社會(huì)現(xiàn)實(shí)相一致,擁有大量粉絲的網(wǎng)絡(luò)大V占據(jù)極少數(shù),絕大多數(shù)的網(wǎng)民只擁有極少數(shù)的粉絲。

7 總結(jié)

通過(guò)分析當(dāng)前的反爬機(jī)制,運(yùn)用Scrapy框架簡(jiǎn)單、模塊清晰的特點(diǎn)以及python豐富完善的標(biāo)準(zhǔn)庫(kù),設(shè)計(jì)了基于Scrapy的網(wǎng)絡(luò)爬蟲。通過(guò)實(shí)驗(yàn)證實(shí),該爬蟲能夠?qū)崿F(xiàn)對(duì)數(shù)據(jù)的高效爬取,為科研工作者獲取微博數(shù)據(jù)提供了一個(gè)較為簡(jiǎn)單快捷的工具。在搜索時(shí),只需要將關(guān)鍵詞修改,就可實(shí)現(xiàn)該主題數(shù)據(jù)的爬取。

參考文獻(xiàn)

[1]新浪微博數(shù)據(jù)中心:2 017微博用戶發(fā)展報(bào)告[EB/OL] http://www. useit. com. cn/thread-17562-1-1.html, 2017.

[2]郭濤,黃銘鈞,社區(qū)網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn)[J],智能計(jì)算機(jī)與應(yīng)用,2012,2 (04):65-67.

[3]廉捷,周欣,曹偉等.新浪微博數(shù)據(jù)挖掘方案[J].清華大學(xué)學(xué)報(bào):自然科學(xué)版,2011, 51(10):1300-1305.

[4]趙本本,殷旭東,王偉.基于Scrapy的GitHub數(shù)據(jù)爬蟲[J],電子技術(shù)與軟件工程,2016,6:199-202.

[5]陳利婷,大數(shù)據(jù)時(shí)代的反爬蟲技術(shù)[J].電腦與信息技術(shù),2016,24 (06): 60-61.

[6]安子建.基于Scrapy框架的網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)與數(shù)據(jù)抓取分析[D].長(zhǎng)春:吉林大學(xué),2016.

[7]陳琳,任芳,基于Python的新浪微博數(shù)據(jù)爬蟲程序設(shè)計(jì)[J].信息系統(tǒng)工程,2016 (09):97-99.

猜你喜歡
爬蟲微博
青少年數(shù)字素養(yǎng)的社會(huì)與文化內(nèi)涵及其教育啟示
利用網(wǎng)絡(luò)爬蟲技術(shù)驗(yàn)證房地產(chǎn)灰犀牛之說(shuō)
基于Python的網(wǎng)絡(luò)爬蟲和反爬蟲技術(shù)研究
利用爬蟲技術(shù)的Geo-Gnutel la VANET流量采集
大數(shù)據(jù)背景下校園輿情的爬蟲應(yīng)用研究
電子制作(2018年2期)2018-04-18 07:13:42
大數(shù)據(jù)環(huán)境下基于python的網(wǎng)絡(luò)爬蟲技術(shù)
電子制作(2017年9期)2017-04-17 03:00:46
“985工程”高校圖書館閱讀推廣的調(diào)查與分析
事實(shí)與流言的博弈
人間(2016年26期)2016-11-03 18:19:04
基于微博營(yíng)銷的企業(yè)推廣模式研究
基于Heritrix的主題爬蟲在互聯(lián)網(wǎng)輿情系統(tǒng)中應(yīng)用
舟曲县| 临澧县| 民乐县| 长治市| 东至县| 禄劝| 临颍县| 上高县| 凤山市| 禹州市| 尚义县| 兴国县| 八宿县| 修水县| 靖西县| 水城县| 阿拉善右旗| 岢岚县| 朔州市| 格尔木市| 历史| 搜索| 澄城县| 长阳| 贵州省| 河南省| 宁城县| 武邑县| 慈利县| 辛集市| 老河口市| 宝坻区| 勐海县| 土默特右旗| 华亭县| 赞皇县| 马鞍山市| 那曲县| 六枝特区| 麻阳| 泾川县|