当前位置: 首页 > 后端技术 > Python

Python爬取豆瓣短片影评+词云

时间:2023-03-26 18:04:10 Python

一、requests+lxml非登录爬取豆瓣数据1、首先打开豆瓣,找到你要爬取的电影短评地址的url,例如:2、打开网页中的开发者工具,在最上面直接按F12电脑,也有区别的,比如用Fn+F12打开ThinkPad,在页面找到网络->点击第一行->找到右边的消息头->向下滑动,找到请求头,记下user-agent?注意:这里的user-agent包括Browser相关信息和硬件设备信息等,可以伪装成合法的用户请求,否则报错403:accesstofilesordirectoryontheserverisdenied'https://movie.douban.com/subject/1292001/'headers={'User-Agent':'****'}4.获取网页数据(html风格的网页)?在非登录的情况下state,使用get()方法data=rq.get(url,headers=headers).textdata输出结果:5.获取网页数据后,需要解析网页s=etree.HTML(data)6、接下来获取网页中的元素信息,如:电影名称、导演、演员、时长等。可以手动获取网页信息,如下图:选中目标标签,右键-click->Copy->XPath(盗用网络图片)7.代码部分#默认返回listlistformatfilm=s.xpath('/html/body/div[3]/div[1]/h1/span[1]/text()')director=s.xpath('/html/body/div[3]/div[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[2]/span[1]/span[2]/a/text()')Starring=s.xpath('/html/body/div[3]/div[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[2]/span[3]/span[2]/a/text()')dur??ation=s.xpath('/html/body/div[3]/div[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[2]/span[13]/text()')print("片名:",film[0])print("导演:",director[0])print("Starring:",Starring[0])print("duration:",duration[0])二、模拟登录豆瓣爬取影评短片1、模拟登录豆瓣(一)登录方式有很多种到豆瓣,这里选择密码登录,首先需要获取密码登录的url。这里的url不是浏览器中的url地址,而是网络传输中的post请求。首先输入错误的账号和密码获取url点击post。才是真正的请求URL。接下来准备头部信息,在消息头部向下滑动,找到cookie和user-agent:然后开始传输用户名和密码,查看传输表单数据:代码部分:s=rq.session()deflogin_douban():#登录地址login_url='https://accounts.douban.com/j/mobile/login/basic'#请求头信息headers={'User-Agent':'****','Cookie':'****'}#传递用户名和密码data={'ck':'','name':'username','password':'password','remember':'false','ticket':''}try:r=s.post(url=login_url,headers=headers,data=data)r.raise_for_status()except:print("loginrequestfailed")return0#打印请求结果print(r.text)返回12.登录后爬取某页数据1.爬取前需要获取当前页面的url,例如获取第一页短评论的url,点击短评论,然后根据下图找到网址。同理,找到user-agent代码如下:comment_url='****'#requestheaderheaders={'user-agent':'Mozilla/5.0'}try:r=s.get(comment_url,headers=headers)r.raise_for_status()except:print('crawlingrequestfailed')return02、CrawlingAfterfetch请求发送成功,使用正则表达式提取影评内容?mark:re库主要用于字符串匹配comments=re.findall('(.*)',r.text)ifnotcomments:return03.获取到数据后写入text中(可以逐行写入,也可以全部写入)withopen(COMMENTS_FILE_PATH,'a+',encoding=r.encoding)asfile:file.writelines('\n'.join(comments))4.只能获取一页数据。为了获取更多数据,需要添加翻页功能。在URLhttps://movie.douban.com/subj...中,start为起始值,limit为每页显示的数据量。当你点击下一页时,你会发现start每次都是从0+20开始,依次向后翻页。因此只需修改代码中的start值即可实现批量爬取数据,但豆瓣限制每个账号最多获取500个。5.最终获取的数据:6.所有数据分词后,词云即可马上创建~~~?注意:open添加encoding='UTF-8'表示传输文件的编码格式,否则会出现UnicodeDecodeError错误defcut_word():withopen(COMMENTS_FILE_PATH,encoding='UTF-8')作为文件:comment_text=file.read()wordlist=jieba.cut(comment_text,cut_all=True)wl="".join(wordlist)print(wl)returnwl7,最后一步~生成词云?注意:分词和词云创建都需要新的库,比如jieba,PIL等,注意相应库的引入defcreate_word_cloud():#设置词云形图像wc_mask=np.array(Image.open(WC_MASK_IMG))#数据清理词表stop_words=['is','not','but','still','just','this','this','one','what','Movie','No','hehe']#设置词云配置,如:字体、背景色、词云形状、大小wc=WordCloud(background_color='red',max_words=255,mask=wc_mask,scale=4,max_font_size=255,random_state=42,stopwords=stop_words,font_path=WC_FONT_PATH)#生成词云wc.generate(cut_word())plt.imshow(wc,interpolation="bilinear")plt.axis("off")plt.figure()plt.show()8.词云如下(选择红色底色,好难看。。。)具体代码:https://github.com/shihongyan...