豆瓣电影短评总数多少不一,但是在短评区只能显示500条评论。

例如《囧妈》,评论数达到117120条。

(当我打开爬到的评论时,还以为自己代码有问题,检查代码未发现问题。用手机登录豆瓣APP发现,电影短评并不是全部显示的。)

所以并不是代码的问题。虽然500条评论有点少,但在写爬虫过程中还是遇到各种bug,寻找解决办法的时候也学习到了很多。

Show Time:导入模块

import requests

from bs4 import BeautifulSoup

import csv

requests和bs4用来获取、解析网页,csv用来储存数据。

2. 获取页面

def download_pages(url):

headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3724.8 Safari/537.36',

'Connection': 'keep-alive',

'cookie':'ll="118193"; bid=2-BKkylYZuE; trc_cookie_storage=taboola%2520global%253Auser-id%3D30398b51-ac04-4354-a17e-16f2af9e020b-tuct5157dfe; __gads=ID=f515bc7d9a7a4fd5:T=1578891400:S=ALNI_Maz4pjSB_NxavWDa1fB5IMFQF1MfA; push_doumail_num=0; __utmv=30149280.15092; _vwo_uuid_v2=D300DC12A399D26584AA232FF9F32FBD9|18b180187a8d01fcd0187f0fc2ea37e9; douban-fav-remind=1; douban-profile-remind=1; __yadk_uid=UCh7sYG2OTrqPGlmWgSOlzoYHK4iG3AM; ct=y; vtd-d="1"; push_noty_num=0; ps=y; ap_v=0,6.0; __utma=30149280.1428623878.1578891289.1580356790.1580385922.20; __utmc=30149280; __utmz=30149280.1580385922.20.5.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/passport/login; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1580386771%2C%22https%3A%2F%2Fwww.douban.com%2F%22%5D; _pk_ses.100001.4cf6=*; __utma=223695111.1175745079.1578891388.1580356790.1580386771.16; __utmb=223695111.0.10.1580386771; __utmc=223695111; __utmz=223695111.1580386771.16.9.utmcsr=douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmb=30149280.10.10.1580385922; dbcl2="150923360:Fs2wu4qEzLc"; ck=pGFy; _pk_id.100001.4cf6=995f558cb7f52f20.1578891388.16.1580387779.1580360895.'

,'Referer': 'https://accounts.douban.com/passport/login'

}

r = requests.get(url, headers=headers).content

return r

设置请求头,获取并返回网页内容。

Attention:

刚开始只设置了user-agent,在运行的时候,发现只能读取11页的评论(11*20=220条评论),读取第12页评论时报错。在浏览器中(未登录的状态下)翻到第11页评论,再次点击‘后页’时,出现需要登录的提示。于是在浏览器中登录,复制cookie,粘贴至请求头中。获取Headers内容

3. 获取需要内容,并翻页

def parse_html(html):

soup = BeautifulSoup(html, features='lxml')

page = soup.find('div', attrs={'class':'mod-bd', 'id':'comments'})

comment_list = []

for i in page.find_all('div', attrs={'class':'comment'}):

info = i.find('span', attrs={'class':'comment-info'})

name = info.find('a').getText()

text = i.find('span', attrs={'class':'short'}).getText()

time = i.find('span', attrs={'class':'comment-time'}).getText()

x = info.find('span')

if x.getText() == '看过':

star = x.find_next_sibling('span')['title']

comment_list.append({'ID': name,

'Time': time,

'star': star,

'comments':text})

navi = page.find('div', attrs={'id':'paginator', 'class':'center'})

next_page = navi.find('a', attrs={'class':'next'})

if next_page:

next_url = URL + next_page['href']

print(next_url)

return comment_list, next_url

else:

return comment_list, None

代码详解:

先观察网页元素,用for循环找到每一用户。

需要的抓取的数据是用户名、评级、评论时间、短评。

用户名、短评、时间都可以用getText()直接获取,但是评级,我用了

x.find_next_sibling('span')['title']

因为在评级那一列除了span,没有别的可以定位的元素,获取所需数据后用append加进comment_list列表。

翻页问题:

观察网页元素,可以看到在

page.find('div', attrs={'id':'paginator', 'class':'center'})

后有三条url(首页、前页、后页),我需要后页,后页中有元素class='next',于是可以定位到指向后页的url。最后一页

当翻到最后一页不能再继续翻页了,page.find('div', attrs={'id':'paginator', 'class':'center'}) 后无元素class='next',所以若可以获取指向后页的url则与主url拼接,并返回next_page的url,否则返回None。

navi = page.find('div', attrs={'id':'paginator', 'class':'center'})

next_page = navi.find('a', attrs={'class':'next'})

if next_page:

next_url = URL + next_page['href']

print(next_url)

return comment_list, next_url

else:

print('this is the last page')

return comment_list, None

4. 储存数据

def main():

url = URL

with open('comments.csv','wt', newline='', encoding='utf_8_sig') as comments:

cw = csv.DictWriter(comments, fieldnames=['ID', 'Time', 'star','comments']) #fieldnames必须与dict里的keys相同

cw.writeheader() #先写header避免header被多次写入。

while url:

html = download_pages(url)

comment_list, url = parse_html(html)

cw.writerows(comment_list)

储存数据比较简单,需要注意和我犯过的错误都注释在代码里了。用了while循环,若在上一步中返回了url,就循环两个函数并继续写入数据,若返回None就结束了。

抓取的部分《囧妈》短评如图所示,500条。(第501行里的star是#######,是因为该用户没有评分。)

整理下来发现还是比较简单的,但是从刚刚开始到最后无报错顺利抓取500条短评还是废了零基础的我一些时间的。

最后总结两点:python官方documentation和标准库的查找使用。有时候报错或是不知道该如何继续下去了,在网上找“轮子”也解决不了,可以去看doc,里面有各种方法,要善用。

细心。有时候频频报错或是抓取的数据有问题,最后发现却是细节导致的。

零基础学习Python,方向是数据分析。有不周到的地方,希望同学们能提出来。

谢谢阅读。

python爬虫豆瓣电影短评_豆瓣Python爬虫:500条电影短评相关推荐

  1. python分布式爬虫开题报告范文_基于Python的豆瓣Top250排行榜影片数据爬取和分析开题报告...

    一.选题依据:(简述研究现状,说明该毕业设计的设计目的及意义) 研究现状 Python是一门很全面的语言,又随着大数据和人工智能的兴起,广受爬虫设计者们的青眯.设计者们运用Python语言的框架-Sc ...

  2. python爬虫电影资源_【Python爬虫】第十六次 xpath整站抓取阳光电影网电影资源

    [Python爬虫]第十六次 xpath整站抓取阳光电影网电影资源# 一.解析电影url # 请求15题构造出的每个电影菜单的分页url,解析出每个电影url # 二.xpath解析电影资源 # 对第 ...

  3. python爬取电影评分_用Python爬取猫眼上的top100评分电影

    代码如下: # 注意encoding = 'utf-8'和ensure_ascii = False,不写的话不能输出汉字 import requests from requests.exception ...

  4. python做出来的东西_【python小白】 做了一个爬虫,但是爬出来的东西无法存储...

    问题如下: # -*- coding:utf-8 -*- from urllib.request import urlopen import bs4 import webbrowser import ...

  5. python爬虫反爬机制_浅谈爬虫及绕过网站反爬取机制之Python深度应用

    我们中公优就业的老师希望能给那些面临困境的朋友们带来一点帮助!(相关阅读推荐:Python学习就看这里!) 爬虫是什么呢,简单而片面的说,爬虫就是由计算机自动与服务器交互获取数据的工具.爬虫的最基本就 ...

  6. 基于python爬虫技术的应用_基于Python爬虫技术的应用

    办公自动化杂志 一.引言 本文主要是对 Python 爬虫技术进行阐述,基于 python 的爬虫与其他语言相比的有很多优势.通过爬去某个网站的所有新闻这个案例,来进一步阐释 Python 爬虫技术的 ...

  7. python websocket库有什么_常用Python爬虫与Web开发库有哪些?

    Python爬虫和Web开发均是与网页相关的知识技能,无论是自己搭建的网站还是爬虫爬去别人的网站,都离不开相应的Python库,以下是常用的Python爬虫与Web开发库. **1.爬虫库** bea ...

  8. python最好用的助手_让Python爬虫变成你的好助手

    据华为我国官方公告,前不久,华为手机我国出文<小白看过来,让Python爬虫变成你的好助手>,原文中详解了Python爬虫的原理,人们看来一下下吧. 下列为<小白看过来,让Pytho ...

  9. python爬虫设计在哪里_《python 爬虫教程 知乎》 怎样用Python设计一个爬虫模拟登陆知乎...

    <python 爬虫教程 知乎> 怎样用Python设计一个爬虫模拟登陆知乎 python 爬虫教程 知乎2020-09-23 01:45:13人已围观 怎样用Python设计一个爬虫模拟 ...

最新文章

  1. More than one file was found with OS independent path 'META-INF/rxjava.properties
  2. swing下拉框从mysql_Java Swing JComboBox下拉列表框的示例代码
  3. java实现qq抢红包_微信抢红包到底是怎么抢到的?
  4. z变换判断稳定性和因果性_图像处理的仿射变换与透视变换
  5. 计算机辅助应用的缩写有什么,计算机辅助设计的英文缩写是什么
  6. java 动态网页_JavaWeb01-动态网页
  7. xtrabackup备份还原的具体操作过程
  8. libiec61850探究【1】-第一个MMS通讯实例
  9. Chromium OS并行运行Linux chroot安装Linux
  10. uni-app小程序实现图片上传和压缩
  11. 阿里云服务器安全组授权对象ip设置
  12. Elasitcsearch CPU 使用率突然飙升,怎么办?
  13. 锐捷无线网络优化 之 精准配置无线接入点发射功率
  14. 第三方支付的商户订单号和支付交易号
  15. turtle画等腰三角形
  16. Oracle更新(update)
  17. BT下载方式改为uTorrent下载、BS上传
  18. 提高中职计算机知识教学改革途径,提高中职计算机基础知识教学改革的途径
  19. c语言桥牌游戏,桥牌游戏介绍
  20. HTML 5 Boilerplate

热门文章

  1. XBOX之Kinect1与2的区别
  2. Tinymce富文本使用教程
  3. 麻瓜回归!零代码,零基础,全网最傻瓜式的滑块验证码识别训练框架
  4. 基于HANA数据库的BW4HANA
  5. 军工企业信息化建设周涛_军工企业非密信息化
  6. GOFLY在线客服系统/外贸网站在线客服+多语言支持 外贸网站即时通讯工具/中英文切换教程...
  7. Windows系统安装Folding@Home图文教程
  8. 架构设计:系统存储(16)——Redis事件订阅和持久化存储
  9. 移动互联网——2011年最值得关注的100个应用程序(目录)
  10. 工信部网站备案的备案流程