網(wǎng)絡空間安全概論 實驗7網(wǎng)絡爬蟲 爬取TOP250電影_第1頁
網(wǎng)絡空間安全概論 實驗7網(wǎng)絡爬蟲 爬取TOP250電影_第2頁
網(wǎng)絡空間安全概論 實驗7網(wǎng)絡爬蟲 爬取TOP250電影_第3頁
網(wǎng)絡空間安全概論 實驗7網(wǎng)絡爬蟲 爬取TOP250電影_第4頁
網(wǎng)絡空間安全概論 實驗7網(wǎng)絡爬蟲 爬取TOP250電影_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1.題目概述

實驗題目:實驗七網(wǎng)絡爬蟲。

實驗要求與目的:熟悉爬蟲工作原理,用相關的python工具包實現(xiàn)網(wǎng)絡爬蟲。

實驗內(nèi)容:爬取T0P250日影的所有短評以及電影的相關數(shù)據(jù)。爬取TOP250豆瓣電影所有

短評,以及電影的相關信息,包括電影類型,上映時間,以及演員列表等信息。

2.開發(fā)平臺及開源工具

本次信息檢索實驗使用的是python語言,開發(fā)工具為PyCharm2021.3,操作系統(tǒng)為

Windows10和Ubuntu18.04服務器,第三方庫均使用pip安裝。

本次實驗使用的第三方庫主要有selenium(自動登錄與信息爬取)、matplotlib(詞頻統(tǒng)計

可視化)、numpy(矩陣處理)、jieba(分詞)等。

3,詳細設計

3.1文件說明

douban_movies.py

主要就是構(gòu)造TOP250排行榜每一頁的鏈接,然后解析每一頁的電影名和電影頁鏈接,然后發(fā)

出爬取電影頁信息的Request,之后利用xpath或者pyquery正常解析網(wǎng)頁信息即可。

defstart_requests(self):

base_url='https://mcvie.douban.com/top250?start=J&filt?r='

forstartinrange(10):

url=str.replace(base_url,,str(start*25))

self.logger.info(trl)

yieldRequest(url,callback=self.parse_top250)

defparse_top250(self,response):

top250_movie_info_iterr=TOP250MovieInfoItem()

html-response.text

doc=pq(html)

all_movies-doc('#cortent>div>div.article>ol>li>div〉div.info')

formovieinall_moviGS.items():

sleep_time=randcm.uniform(0.5,1)

time.sleep(sleep_time)

movie_link=movie('div.hd>a').attr('href')

title=movie('di\<.hd>a>span.title*).text()

top250_movie_info_item['title']=title

top250_movie_info_item['movie_link']=movie_link

(top250_movie_info_item)

yieldtop250_movi6_info_item

#然后發(fā)出超取每個movie的具體信息的request

self.logger.info(movie_link)

yieldRequest(movie_link,callback-self.parse_movie_item)

pipeline.py

#因為在process.Item中會根據(jù)不同的Item迸行不同的查詢防止爬取歪復的信息,所以對不同的collection設置「不同

的索引,畢竟殿后融取到的短評有33萬多條.設置?下索弓I對速度還是右提升的

defopen_spider(self,spider):

self.client=pymongo.MongoClient(self.mongo_uri)

self.db=self.client[self.mongo_db]

self.db[TOP250MovieInioItem.collection].create_index([(*novie_link',pymongo.ASCENDING)])

self.db[MovieInfoItem.collection].create_index([('movie-link',pymongo.ASCENDING)])

self.db[CommentInfoltem.collection].create_index([('commsnter_link',pymongo.ASCENDING),('comme

nt_page_link',pymongo.ASCENDING)])

self.db\Comenterlnfoltem.collection!.createindex([('coiwienterlink',pymongo.ASCENDING)1}

#proces$_item主要是根據(jù)不同的Item進行杳說是否束復和插入

defprocess_item(self,item,spider):

ifisinstance(item,TGP250MovieInfoItem):

condition={'movie_link':item.get('movie_link'))

elifisinstance(item,Movielnfoltem):

condition={'comnients_link':item.get('comments^ink'))

elifisinstance(item,Commentlnfoltem):

condition"{'comnienter_link':item.get('commenter_link'),

'comirient_page_link':item.get('ccxnment_3age_link')}

elifisinstance(item,Commenterlnfoltem):

condition={'commenter_link':item.get('commenter_link'))

result=self.db[item.collection].find_one(condition)

ifresultisNone:

self.db[item.collection].insert(diet(item))

returnitem

middleware.py

middleware中只使用了Se'.eniumMiddleware,其中大部分代碼是破解模擬登錄時破解滑動驗

證碼,由于代碼比較多,破解滑動驗證碼的具體代碼請自行查看。

defprocess_request(self,reqiest,spider):

self.logger.info('PhartomDSisStarting')

try:

self.browser.get(request.url)

time.sleep(l)

html=self.browser.page_source

current_url=request.url

try:

need_login=self.browser.find_element_by_xpath(7/*[^id="db-global-nav"]/div/div[l]/a*)

self.logger.irfo(,需要登錄')

login_link=reed_login.get_attribute('href')

self.open(login_link)

ifself.passwcrd_error():

self.logger.info('名或密碼錯誤')

#如果不需要驗證碼直接登錄成功

ifself.login_successfully():

self.logger.info('不需要驗證碼直接登錄成功’)

#登陸成功僅后跳回朦來的頁面

self.browser.get(currenturl)

else:

#需整臉證碼的情況下登錄

self.loglr_wlth_auth()

ifself.login_successfully():

self,logger.info('需要驗證碼的情況下登錄成功.)

#登陸成功以后跳回原來的頁面

self.trowser.get(currenturl)

elifself.password_error():

self.logger.in??!感枰炞C碼的情況下登錄,用戶名或密碼錯誤')

else:

self.logger.info('需要驗證碼的情況卜登錄,登錄失敗

exceptNoSuchElementException:

self.logger.irf。(?現(xiàn)在不需要登錄,所以找不到登錄元素')

#需要讓瀏覽器模擬隨機滑動頁面,模擬人的行為

random_scroll_nums=random.randint(0,1)

for1inrange(rardom_scroll_nums):

random_scroll_distancel=random.randint(200,5030)

js-'varq-dccument.documentElement.scrollTop='?str(random_scroll_distancel)

self.browser.execute_script(js)

time.sleep(0.3)

random_scroll_distance2=random.randint(200,5030)

js='vanq=dccument.documentElement.scrollTop='+str(random_scroll_distance2)

self.browser.execute_script(js)

time.sleep(0.3)

random_sleep=rardom.uni-form(0.2,0.8)

time.sleep(random_sleep)

returnHtmlResponse(url=request.urlJbody-html,request-request,encoding-'utf-8',

status?200)

exceptTimeoutExcepticn:

self.logger.error('self.browser.get(request.url)happenedTimeoutException')

returnHtmlResponse(url=request.url,status=500,reqjest=request)

exceptException:

self.logger.error('self.browser.get(request.url)hapoenederror')

returnHtmlResponse(url=request.url,status=500,reqjest=request)

comments.py

短評的爬取過程和電影信息爬取略有不同,因為在爬取短評大約40分鐘之后就會無法爬我,

查看日志文件發(fā)現(xiàn)報錯全是Retry,估計是被檢測到異常暫時不允許訪問,所以寫一個shell腳

本,每隔40分鐘啟動一次爬蟲,因為每次爬蟲都是爬取兀部電影的短評,所以在一個tx:文

件中寫一個接下來要爬取的電影index,1開始是0,每次爬蟲都會+10,所以經(jīng)過25次就能

結(jié)束爬蟲,具體爬取的思路和電影信息的爬蟲差不多。

defstart_requests(self):

£每次郵要讀取這次要開旅您的電影的鏈接Index

withopen('/home/zhiycng/data/next_link_num.txt','rt')asf:

#withopen('E:\PycharmProjects\some_data/next_Link_r)um.txt"rt")asf:

next_link_index=f.read()

next_link_index■int(next_link_index)

#將后面開始讀的電影索弓;+10寫入文件

withopen('/home/zhiycng/data/next_link_num.txt','wt')asf:

#withopen('E:\PychQrmProjects\some_data/next_Li.nk_ryum.txt','wt")asf:

new_next_link_ind€x=next_link_index+10

f.write(str(new_n€xt_link_index))

#后面可以物一個從數(shù)據(jù)熔中讀取已爬取的comment鏈接去柬

movie_link_list=seH.get_movie_link_list()

comment_page_link_list=self.get_comment_page_link_list()

forindexinrange(ne>tlinkindex,newnextlinkindex):

ifindex>=250:-

break

movie_link■movi€_link_list[index]

time.sleep(3)

#分別於取好評,中評.差評

choices=['h','m','1']

forchoiceinchoices:

#於取得種評論之前先steep一段時間

every_type_connents_sleep=random.randint(2,5)

time.sleep(ev€ry_type_comments_sleep)

comment_suffi>=>comments?start=$&limit=20&sort=new_score&status=P,

real_comments_link?movie_link+comment_suffix

ifchoice■■"h':

real_comm€nts_link=real_comments_link+'&3ercent_type=h'

elifchoice=="1":

real_comm€nts_link=real_comments_link+'&3ercent_type=l'

else:

real_comm€nts_link=real_comments_link+'&3ercent_type=m'

forstartinrange(25):

tmp_link=real_comments_link

request_cc?nments_link=str.replace(tmp_link,',str(start*20))

ifrequest_comments_linknotincomment_page_link_list:

#然篇I以爬取格'movie的短評信息

self.logger.info(request_comments_link)

yieldRequest(url=request_comments_link,callback=self.parse_comments)

else:

(request_comments_link)

self.logger.info(,該燧接巨經(jīng)爬取過")

commenters.py

現(xiàn)階段爬取評論者的問題主要是速度太慢,畢竟一個網(wǎng)頁最多只有一個用戶的信息,再就是爬

取時間過長也容易遇到Retry的問題,打算后面考慮一下有沒有什么彌補措施。

defstart_requests(self):

co<nnienter_link_list=self.get_commenter_link_list()

crawled_commenter_linl<_list-self.get_crawled_coiwnenter_link_list()

forcommenter」inkincommenterlinklist:

ifcommenter_linknotincrawled_commenter_link_list:

crawled_commerter_link_list.append(commenter_lin<)

time.sleep(4)

self.logger.irfo(commenter_link)

yieldRequest(url=commenter_link>callback=self.oarse_commenters)

評論者信息爬取過程和前面其他爬蟲最大的不同就是解析網(wǎng)頁時一些異常情況的處理,比如賬

號已注銷,賬號已被永久停用等...其他地方和前面的爬蟲大同小異。

defparse_commenters(self,response):

connnenter_info_item=Commenterlnfoltem()

co<nmenter_link=response.xpath('//"[0id="db-usr-profile"]/div[2]/ul/li[l]/a/@href').extract()

try:

commenter」ink=commenter_link[0]

exceptIndexError:

#已經(jīng)注銷殊號的用戶會出錯

self,logger.info「該用戶已經(jīng)主動注銷帳號?)

raturn

commenter_info_item['commenter_link']=commenter_link

location=response.xpath('//?[0id="prof:ile"]/div/cliv[2]/div[l]/div/a/text()').extract()

iflocationisNone:

Icoation='未知,

else:

location=location[0]

exceptIndexError:

Icoation=,未知,

commenter_info_item['location']■location

register_timestamp■response.xpath('//*[^id?"profile"]/div/div[2]/div[l]/div/div/text()[2;').ex

tract()

try:

register_timestamp=register_timestamp[0]

#截取xxxx-xx-xx口期

result■晚*1.仙2]1('(.*)加入',register_timestamp)

register_timestamp=result⑻

register_timestamf=register_timestamp[0:10]

exceptIndexError:

#因為有的賬號根期log查看后發(fā)現(xiàn)是般永久停用的,沒法獲取注冊時間

register_timestaniF=datetime.date.today()

commenter_info_item['register_timestamp']=register_timestamp

account_name=response.xpath('//*[0id="profile"]/div/div[2]/cliv[l]/div/div/text()[l]').extract()

try:

account_name=account_name[0]

account_name=str.strip(account_name)

commenter_info_it€m['account_name']=account_name[0]

exceptIndexError:

"這種情況是依據(jù)用戶管理細則,修號已被永久停用。

self.logger.inf。('該依據(jù)用戶管理細則,帳號已被永久停用

return

following_num=response.xpath('//*[0id=Mfriend"]/h2/span/a/text()").extract()

try:

followine_num=fcllowine_num[0]

#截取成員xxx中的數(shù)字

commenter_info_it€m['following_num']=following_num[2:]

exceptIndexError:

#姐親沒有關注的人的運沒有用戶關注多少人,但會看夠電人關注

following_num-0

foilower_num-response.xpath('//*[@id?"content"]/div/di7[2]/p[l]/a/text()').extract()

follower_num=follow€r_num[0]

result=re.findall("被(.*)入關注",follower_num)

foilower_num■result[0J

commenter_info_item['-followe^nuin']■follower_num

self.logger.info(comm€nter_info_item)

yieldcommenter_info_item

comments_spider.sh

在菜鳥教程和博客園看了一點shell的基礎知識和教程寫的腳本,這里有點沒有明白,是一個

以后提升自己的方向。

#,/bin/bash

cd/hofne/guyang/pycharm_projects/TPO250_douban_movies/

n=l

while(($n<=26))

do

echo$n

((2))

scrapycrawlcomments>>irovie_comments.log2>&1&

sleep2400

done

足仃

直接在命令行執(zhí)行命令即可:

先啟動爬取電影信息的爬蟲;

scrapycrauLdouban_movies

"或者后臺執(zhí)行,將盛出理定向到日志文件中

nohupscrapycrawLdouban_movies>douban_movies.Log2>&1&

再啟動爬取評論的爬蟲(因為短評的網(wǎng)頁鏈接需要根據(jù)數(shù)據(jù)庫里的電影鏈接構(gòu)造);

scrapycrawlcomments

(f或者后分執(zhí)行,將輸出京定向到日志文件中

nohupscrapycrawlcomments>cofliments.log2>81&

scrapycrawlcommenters

#或者后臺執(zhí)行,將輸出事定向到日志文件中

nohupscrapycrawlcommenters>commenters.log2>81&

4.運行結(jié)果

TOP250排行榜要爬取的信息:

|肖申那雕/TheShawshankRedemption/月患泣(港)/剌激1995(臺)|[可播放)

導演弗蘭克德拉邦特FrankDarabont主演替姐羅賓斯TimRobbins/…

1994/美國/犯罪劇情

★★★★★971673033人評價

“希里讓人自由。”

每部電影要爬取的具體信息:

N0.1^S^feTop25O_________________________________________________________

肖申克的救贖TheShawshankRedemption]由

導演:死三弟拉轉(zhuǎn)待I

編感苑三皂第拉邦特小慢百

三演:壬上夢三能/摩根笄里旻/向淳區(qū)自/或期與1

//克蘭西?布朗/于與I

快:包專左靠]

制片國家他區(qū)美三

語言:英語

上映E期1%49%10(多倫多電影節(jié))/1994-10-14(^^)

片長142分鐘

又名.月亮商飛(港)/更裁1995(臺)/期格言/按度歲月/好于99%劇情片

治善克的致降行99%)囪片

至百哀圖IMDbgs^ttO111161

云湃名稱閆申克的救加現(xiàn)三方評價信息中

曖TheShawshankRedemption1994tt0111161

肯申克的救贖的劇情簡介

20世紀40年代末.小有成就的15年我行家安安(希后羅賓斯TimRobbins飾)

醫(yī)涉浜條害妻子及蛇的情人而鐐輅人就.在這里名為肖日完的監(jiān)維內(nèi).希望似乎虔

無凄亂修身監(jiān)禁的注罰無疑注定了去道座下天灰瑁送望的人生.未過多久.安迪

裳試揍近因犯二葭有聲望說綣(摩模兜里曼MorganFreeman飾),請求對方福

目己項充,J根子.以此為契機.二人逐濟跖稔,安迪也仿怫在魚龍混會.靠忍搐

生、黑蘭混淆的車很毛或到屬于自己的天生之道,他利足巨身的專業(yè)知識.學助空

發(fā)言這后院、洗案錢.同時憑借與清智的交往在犯人牛河也漸漸受油1濯,裝直

春天,他已Q酒筆那柱對那堵整墻從、飛轉(zhuǎn)變?yōu)樘幹┖?,但是對巨目的渴里仍促

使心就為口廣的無望刊且標前而關于箕罪行的真相,似乎更使這一切朝蛔壬S

了一步……

本片喂完善守諄即夠芬全(StephenEdwinKing)的(展開全部)?豆二

爬取的TOP250豆瓣電影信息:

>_id:ObjYId(“5dbf99;b8dS4c31B352bb5”)

title:"St"

year:"(1994)-

director:?張藝UP

zi.roles:““優(yōu),蝴/姜武,牛經(jīng)/郭濤/張璃/儻大紅/肖瑯,R,蠣池/的范/黃宗洛/丸質(zhì)理/

>rating_related_info:Object

brief,stro:"

cownent_i>un:10S151

coments.link:-https://movie.iouban.caB/sut>ject/129236S/c<xments?status.P"

>aovie_genre:Array

id:Obj?tId<-Sdbf99d7?d84c313JSMabcl-)

title:

ywr「(26,8)”

dirztor:?文牧野.

-ain.roles:/王傳晉/ffl-ffi/HQ/董宇/場新嗎/王佳佳/王凱輝/鹿飛/表語芯/寧浩/李乃文/

>rating_related_info:Object

brief.Intro:""

coonent_nuw:484950

comnents.link:"https://movie.iouban.co?/subject/26752088/coiwents?status?P-

>novie_genre:Array

_id:ObjtctId("Sdbf99d78484c3IHSzbe”)

title:“這個好不太冷lEn"

year:"(1994)-

director:?呂克?貝松”

2in_rol”「讓?JB諾/鄭弼?靖曼/漉?奧律曼/丹尼?愛羅/筱得?阿做爾/邁物?巴達舍科/艾倫?格里尼/伊麗莎白?瑞根??

>rating-related-info:Object

brief_intro:""

connentjwn:275767

connents_llnk:*https://movie.iouban.coo/subject/1295644/co??nts?status.Pw

>novie-genre:Array

結(jié)果存入csv文件:

力,濟分,長人.一~中.——...

ne%nttK”*42£?^IMV?rX?3<97mnu入伸飲WlfLtARtb.必98ssz

wa*siex4^ov?i'著直黑**.,―辦X9U3人#價以用他,0“R4b?T?oQW/a?2、ao714U3pg

MtfZfl**羅的3多第A?配■工建?,E?r<3ts人6"_?E.汽史.0〃》r^2dxjb?r?ocs*v???*ph0to'?.a??o.po?av?(puMcrrC3T2XfWr

?也尼克9聘■■>?十?m?9Cm^上■■,?伊94KWM?人伊小臭A的夕ftAin皿4tcr?o5mx詢

“個?▼不3■■苗

was<xeuamontau?Mtit42W?MAWt>?..W;'9易率.不iRVIZ.doutianocxvrk\WA>l^oayi.rat>o^otf?f>pwe*o^211XiC61m

??At9*,伯艮發(fā)定Xaot?rwdm^?£?fen96UUilJ入秘■nw〃2dx^r?oo>?vf?hoic?,-MOt?nnr」pub*</27M74n3PQ

號,K??~i^3,tA?l?JI?uw^J4AWl>ih**r3,;1?】E人/松■w短IT。,0.VtTfll,℃po?*,2c85?乃3?小

A.£.發(fā).匿a管■幺E&CMiberg>10猊4kgK961M10人#IV■■―個人op?,,F(xiàn)??XMCcmf

“空一WSIS”iwim人伊飲皿rmC6m

姓牌waS412g<A浦松>?-?/)■UR2J818討空d*它力押叁w*od?a*pMa>r.,Reu,MMKn:K

n>ISt^?A?UtwMWh<tC*riSflft2t4】對》16人,歌ACB*atiOJVBnZ.M〃<23d內(nèi)

???評鈔

ftcntill號■木P?ikf?Ra^C^.'ffK??UUa3,:重身”人.兄力*收體.J?q義改立0pv,f?4cl8mg9Rirfc,ZAc/p4PM2V7口

?v

上■9?wa???rtMf8OuMUM'onM>c19?nirWTrrAotfv93iSUUTAiftVA?I4-?HCM7ri?*.夏?衾*?0八2dsvbM?os?w160s,_*>_8>-,86*</心?出功也卬

二■又■!:艘工??甘?馬?町茫26WMOf?iaRJI?:lAMwW^'t921E?從例>皿,,TAotenocgf,l>ho?yi皿fOllxlMA&ERTTSUlQ

K?人■獻晶?Si??K^HAnA^Urto*1941G八浦t>令五力XA13“try;MVWmRhg、*opo?v.'$*e?c^pUaieL71tpg

號,丸■■性矢巴心?:皿*3Mb2?代巴??”■,9312360人停的星■■之上.OAKtK4〃g2Svb*r?08*v*m8os,.g>giecw64</691?2期

方“,?別?,0?1v?K殳麗/牛因??/n1F&W人評外.史上今*?<!”的£,.nf4oo?VMrm*p6Q?&t.*w.pMar<'pv^<n>7M4M4M)n

N??!??nte^A4^??s*w??,MTIU,CA?S,?■依醫(yī)”■■■?■?1???4??,卜21>?/?^>?2

火亦■之火勢?京Wt>!WnWTr?>Uv14..gecEKNMvJIjLWg.MSK92HWT?人”外一丸,量.K4〃E>g^?opM*/g</0?aWP?fig

W?3A克日力?fWQtB??R?UteWWMAilK'比川。??分件A.0〃7ldxjbm>CWBMJ2U>.M"2*c/pIMaiWapg

?爐II%MOono±WftWYOOGenyMAYv?r?X笫如從”怏再■力了4kllrHa2〃B4Zr?oa>?6<w6o9,ye8Mm》內(nèi)

*XW

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論