网络空间安全概论 实验7网络爬虫 爬取TOP250电影_第1页
网络空间安全概论 实验7网络爬虫 爬取TOP250电影_第2页
网络空间安全概论 实验7网络爬虫 爬取TOP250电影_第3页
网络空间安全概论 实验7网络爬虫 爬取TOP250电影_第4页
网络空间安全概论 实验7网络爬虫 爬取TOP250电影_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.题目概述

实验题目:实验七网络爬虫。

实验要求与目的:熟悉爬虫工作原理,用相关的python工具包实现网络爬虫。

实验内容:爬取T0P250日影的所有短评以及电影的相关数据。爬取TOP250豆瓣电影所有

短评,以及电影的相关信息,包括电影类型,上映时间,以及演员列表等信息。

2.开发平台及开源工具

本次信息检索实验使用的是python语言,开发工具为PyCharm2021.3,操作系统为

Windows10和Ubuntu18.04服务器,第三方库均使用pip安装。

本次实验使用的第三方库主要有selenium(自动登录与信息爬取)、matplotlib(词频统计

可视化)、numpy(矩阵处理)、jieba(分词)等。

3,详细设计

3.1文件说明

douban_movies.py

主要就是构造TOP250排行榜每一页的链接,然后解析每一页的电影名和电影页链接,然后发

出爬取电影页信息的Request,之后利用xpath或者pyquery正常解析网页信息即可。

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

#然后发出超取每个movie的具体信息的request

self.logger.info(movie_link)

yieldRequest(movie_link,callback-self.parse_movie_item)

pipeline.py

#因为在process.Item中会根据不同的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主要是根据不同的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?。「需要验证码的情况下登录,用户名或密码错误')

else:

self.logger.info('需要验证码的情况卜登录,登录失败

exceptNoSuchElementException:

self.logger.irf。(•现在不需要登录,所以找不到登录元素')

#需要让浏览器模拟随机滑动页面,模拟人的行为

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分钟之后就会无法爬我,

查看日志文件发现报错全是Retry,估计是被检测到异常暂时不允许访问,所以写一个shell脚

本,每隔40分钟启动一次爬虫,因为每次爬虫都是爬取兀部电影的短评,所以在一个tx:文

件中写一个接下来要爬取的电影index,1开始是0,每次爬虫都会+10,所以经过25次就能

结束爬虫,具体爬取的思路和电影信息的爬虫差不多。

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))

#后面可以物一个从数据熔中读取已爬取的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(,该燧接巨经爬取过")

commenters.py

现阶段爬取评论者的问题主要是速度太慢,毕竟一个网页最多只有一个用户的信息,再就是爬

取时间过长也容易遇到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)

评论者信息爬取过程和前面其他爬虫最大的不同就是解析网页时一些异常情况的处理,比如账

号已注销,账号已被永久停用等...其他地方和前面的爬虫大同小异。

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:

#已经注销殊号的用户会出错

self,logger.info「该用户已经主动注销帐号•)

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查看后发现是般永久停用的,没法获取注册时间

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:

"这种情况是依据用户管理细则,修号已被永久停用。

self.logger.inf。('该依据用户管理细则,帐号已被永久停用

return

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

try:

followine_num=fcllowine_num[0]

#截取成员xxx中的数字

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

足仃

直接在命令行执行命令即可:

先启动爬取电影信息的爬虫;

scrapycrauLdouban_movies

"或者后台执行,将盛出理定向到日志文件中

nohupscrapycrawLdouban_movies>douban_movies.Log2>&1&

再启动爬取评论的爬虫(因为短评的网页链接需要根据数据库里的电影链接构造);

scrapycrawlcomments

(f或者后分执行,将输出京定向到日志文件中

nohupscrapycrawlcomments>cofliments.log2>81&

scrapycrawlcommenters

#或者后台执行,将输出事定向到日志文件中

nohupscrapycrawlcommenters>commenters.log2>81&

4.运行结果

TOP250排行榜要爬取的信息:

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

导演弗兰克德拉邦特FrankDarabont主演替姐罗宾斯TimRobbins/…

1994/美国/犯罪剧情

★★★★★971673033人评价

“希里让人自由。”

每部电影要爬取的具体信息:

N0.1^S^feTop25O_________________________________________________________

肖申克的救赎TheShawshankRedemption]由

导演:死三弟拉转待I

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

三演:壬上梦三能/摩根笄里旻/向淳区自/或期与1

//克兰西・布朗/于与I

快:包专左靠]

制片国家他区美三

语言:英语

上映E期1%49%10(多伦多电影节)/1994-10-14(^^)

片长142分钟

又名.月亮商飞(港)/更裁1995(台)/期格言/按度岁月/好于99%剧情片

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

至百哀图IMDbgs^ttO111161

云湃名称闫申克的救加现三方评价信息中

暧TheShawshankRedemption1994tt0111161

肯申克的救赎的剧情简介

20世纪40年代末.小有成就的15年我行家安安(希后罗宾斯TimRobbins饰)

医涉浜条害妻子及蛇的情人而镣辂人就.在这里名为肖日完的监维内.希望似乎虔

无凄乱修身监禁的注罚无疑注定了去道座下天灰瑁送望的人生.未过多久.安迪

裳试揍近因犯二葭有声望说绻(摩模兜里曼MorganFreeman饰),请求对方福

目己项充,J根子.以此为契机.二人逐济跖稔,安迪也仿怫在鱼龙混会.靠忍搐

生、黑兰混淆的车很毛或到属于自己的天生之道,他利足巨身的专业知识.学助空

发言这后院、洗案钱.同时凭借与清智的交往在犯人牛河也渐渐受油1濯,装直

春天,他已Q酒笔那柱对那堵整墙从、飞转变为处之泰宏;,但是对巨目的渴里仍促

使心就为口广的无望刊且标前而关于箕罪行的真相,似乎更使这一切朝蛔壬S

了一步……

本片喂完善守谆即够芬全(StephenEdwinKing)的(展开全部)©豆二

爬取的TOP250豆瓣电影信息:

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

title:"St"

year:"(1994)-

director:・张艺UP

zi.roles:““优,蝴/姜武,牛经/郭涛/张璃/傥大红/肖琅,R,蛎池/的范/黄宗洛/丸质理/

>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

结果存入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*,伯艮发定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.£.发.匿a管■幺E&CMiberg>10猊4kgK961M10人#IV■■―个人op»,,F«»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内

・・・评钞

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,・■依医”■■■・■•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》内

*XW

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论