在 使用爬虫爬取豆瓣电影影评数据Java版 一文中已详细讲解了爬虫的实现细节,本篇仅为展示Python版本爬虫实现,所以直接上代码

完整代码

爬虫主程序

# 爬虫启动入口

from C02.data import processor

from C02.page import downloader, parser

from C02.url import manager

class Spider(object):

def __init__(self):

self.url_manager = manager.Manager()

self.page_downloader = downloader.Downloader()

self.page_parser = parser.Parser(base_url='https://movie.douban.com/subject/26752088/comments')

self.data_processor = processor.Processor(host='192.168.0.105', collection='movie_26752088_comments')

def start(self, root_url):

"""

启动爬虫方法

:param root_url: 启动URL

:return: 抓取的URL数量

"""

nums = 0

self.url_manager.append_new_urls([root_url])

while self.url_manager.has_new_url():

nums += 1

new_url = self.url_manager.get_new_url()

print('开始下载第{:03}个URL:{}'.format(nums, new_url))

html = self.page_downloader.download(new_url)

if html is None:

print('html is empty .')

continue

links, results = self.page_parser.parse(html)

if len(links) > 0:

self.url_manager.append_new_urls(links)

if len(results) > 0:

self.data_processor.process(results)

return nums

if __name__ == "__main__":

spider = Spider()

nums = spider.start("https://movie.douban.com/subject/26752088/comments?start=0&limit=20&sort=new_score&status=P")

print('爬虫执行完成,共抓取{}个URL'.format(nums))

URL管理器

def url_checker(fn):

"""

URL合法性检查器

:param fn:

:return:

"""

def wrapper(obj, urls):

# url 格式检查,这里主要检查url部分是否是:

# https://movie.douban.com/subject/26752088/comments

# 本次任务只抓取该电影影评,所以忽略其它URL

# 直接在原urls列表上修改遇到问题(&percent_type=部分移除不掉),所以直接用一个新列表重新装入url列表

lst = []

for url in urls:

# 将不匹配的URL从列表中删除

if '/subject/26752088/comments' not in url:

continue

# 将url中的 &percent_type= 参数移除,避免造成重复抓取(有些链接带这个参数有些不带)

if '&percent_type=' in url:

url = url.replace('&percent_type=', '')

lst.append(url)

return fn(obj, lst)

return wrapper

class Manager(object):

"""

单机URL管理器

"""

def __init__(self):

self.new_urls = []

self.old_urls = []

@url_checker

def append_new_urls(self, urls):

if len(urls) == 0:

return

for url in urls:

if url in self.new_urls or url in self.old_urls:

continue

else:

self.new_urls.append(url)

def has_new_url(self):

return len(self.new_urls) > 0

def get_new_url(self):

"""

获取一个新的URL,内部隐含了URL抓取过后加入已抓取队列操作(所以这里不考虑实际抓取过程中的失败情况)

:return:

"""

url = self.new_urls.pop()

self.old_urls.append(url)

return url

网页下载器

import requests

class Downloader(object):

@staticmethod

def download(url):

try:

# 如果不登录抓取的数据会很有限,这里简化处理认证部分逻辑,直接把我的cookie信息复制过来

resp = requests.get(url,

headers={

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',

'Cookie': 'gr_user_id=b6c0778d-f8df-4963-b057-bd321593de1e; bid=T-M5aFmoLY0; __yadk_uid=WvMJfSHd1cjUFrFQTdN9KnkIOkR2AFZu; viewed="26311273_26877306_26340992_26649178_3199438_3015786_27038473_10793398_26754665"; ll="108296"; as="https://movie.douban.com/subject/26752088/comments?start=60&limit=20&sort=new_score&status=P"; ps=y; dbcl2="141556470:E4oz3is9RMY"; ck=OvCX; _vwo_uuid_v2=E57494AA9988242B62FB576F22211CE4|e95afc3b3a6c74f0b9d9106c6546e73e; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1531194535%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D0saOVVzXJiEvkbYGxCXZ849EweAjA2om6cIvPZ7FxE35FrmKU8CfOHm1cC9Xs0JS%26wd%3D%26eqid%3De5307bbf0006c241000000045addc33f%22%5D; ap=1; _pk_id.100001.4cf6=cee42334e421195b.1522208966.4.1531200264.1531191315.; _pk_ses.100001.4cf6=*; __utma=30149280.1283677058.1481968276.1531190383.1531194536.34; __utmb=30149280.0.10.1531194536; __utmc=30149280; __utmz=30149280.1524482884.31.29.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmv=30149280.14155; __utma=223695111.1691619874.1522208966.1531190383.1531194536.4; __utmb=223695111.0.10.1531194536; __utmc=223695111; __utmz=223695111.1524483025.2.2.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; push_noty_num=0; push_doumail_num=0'

},

timeout=3.0)

resp.raise_for_status()

return resp.text

except requests.RequestException as e:

print(e)

网页解析器

from bs4 import BeautifulSoup

from urllib import parse

class Parser(object):

def __init__(self, base_url=None):

self.base_url = base_url

def parse(self, html):

soup = BeautifulSoup(html, 'html.parser')

# 超链接列表

links = []

for a in soup.select('#paginator > a'):

if self.base_url is not None:

links.append(parse.urljoin(self.base_url, a.get('href')))

else:

links.append(a.get('href'))

# 数据列表

results = []

for div in soup.select('#comments > div.comment-item'):

author = div.select_one('h3 > span.comment-info > a').get_text(strip=True)

date = div.select_one('h3 > span.comment-info > span.comment-time').get_text(strip=True)

rating = div.select_one('h3 > span.comment-info > span.rating')

star = None

if rating is not None:

star = rating.get('class')[0].replace('allstar', '')

vote = div.select_one('h3 > span.comment-vote > span.votes').get_text(strip=True)

comment = div.select_one('div.comment > p').get_text(strip=True)

results.append({

'author': author,

'date': date,

'star': star,

'vote': vote,

'comment': comment

})

return links, results

数据处理器

import pymongo

class Processor(object):

def __init__(self, host=None, port=27017, database='douban', collection='movie_26752088_comments'):

self.client = pymongo.MongoClient(host=host, port=port)

self.database = database

self.collection = collection

def __del__(self):

self.client.close()

def process(self, results):

comments = self.client.get_database(self.database).get_collection(self.collection)

return comments.insert(results)

结语

纯属练手作,勿喷

python爬虫豆瓣电影评价_使用爬虫爬取豆瓣电影影评数据Python版相关推荐

  1. scrapy mysql 豆瓣_利用Scrapy爬取豆瓣图书并保存至Mysql数据库

    Scrapy是一个纯Python语言写的爬虫框架,本次用它来爬取豆瓣图书的数据. 准备工作 没有安装Scrapy的同学需要安装一下,有两种方式安装: 安装了Anaconda的同学直接在命令行输入con ...

  2. 爬虫实战(一)利用scrapy爬取豆瓣华语电影

    爬虫第一个项目是爬取豆瓣华语电影,后面将对这部分数据进行分析. 本文也是发表于『运筹OR帷幄』微信公众号的<用数据带你了解电影行业-华语篇>的爬虫介绍篇. 1. 爬取思路 在观察了豆瓣每个 ...

  3. Python爬虫:现学现用xpath爬取豆瓣音乐

    爬虫的抓取方式有好几种,正则表达式,Lxml(xpath)与BeautifulSoup,我在网上查了一下资料,了解到三者之间的使用难度与性能 三种爬虫方式的对比. 这样一比较我我选择了Lxml(xpa ...

  4. 【python爬虫自学笔记】(实战)----爬取猫眼电影榜单Top100

    目的:爬取猫眼电影榜单TOP100的信息并保存在文档中. 查看网站结构,确定思路: 首先请求网页的地址为maoyan.com/board/4,电影信息的内容包含在一个个dd标签之中,分析dd标签中的内 ...

  5. Python爬虫实战,requests+openpyxl模块,爬取手机商品信息数据(附源码)

    前言 今天给大家介绍的是Python爬取手机商品信息数据,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这样的纯文本 ...

  6. Python爬虫实战,requests+parsel模块,爬取二手房房源信息数据

    前言 最近在尝试用Python爬虫二手房房源信息数据,在这里给需要的小伙伴们提供代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这样的纯文本 ...

  7. Python语言实现用requests和正则表达式方法爬取猫眼电影排行榜前100部电影

    #爬取猫眼电影排名前100的电影 import requests #电脑向服务器发送的请求库 from requests.exceptions import RequestException impo ...

  8. 利用python爬取豆瓣音乐_Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析

    节点的子节点,获取排名的代码为:li.span.text 绿色框中A节点中是歌曲的链接和图片链接,获取歌曲链接的代码为:li.a['href'] 蓝色框中是歌曲的名字.演唱者和播放次数,歌曲名是在cl ...

  9. 【Python 爬虫】(二)使用 Requests 爬取豆瓣短评

    文章目录 Requests库介绍 Requests库安装 Requests库的简单用法 实战 爬虫协议 Requests库介绍 Requests库官方的介绍有这么一句话:Requests,唯一的一个非 ...

最新文章

  1. mongodb log ,warning: chunk is larger than 65203623200 bytes because of key
  2. 【决策】Waymo无人出租车年底发射,现已进入定价环节 | 公交部门竟成友军?...
  3. HR最常用的Excel技巧,职场必备,值得收藏转发!
  4. MySQL中的默认值处理
  5. Windows下rsync软件配置和使用【数据同步】
  6. 【❤️算法系列之二叉树的实现(包含前序、中序、后序遍历以及节点的查找和删除)❤️】
  7. 计算机网络之物理层:3、奈式准则和香农公式
  8. python 数据类_python数据类
  9. Linux tcp三次握手,解读TCP三次握手
  10. ggplot2 | 注释函数
  11. 动我 Java?是时候让甲骨文退休了!
  12. 防止sql拼接的Java方法_JAVA程序防止SQL注入的方法
  13. psp测试电池软件,电玩巴士首测成功-PSP神奇电池恢复砖头与降级
  14. DIV+CSS命名规范
  15. MySQL事务的保证机制
  16. 如何用html制作快速邮箱发到手机qq,简单两步使用node发送qq邮件的方法
  17. MongoDB:排序超出了内存限制的104857600字节
  18. 获取具体日期N个月前(后)的自然月时间戳
  19. JVM性能调优3_垃圾收集器与内存分配策略__享学课堂
  20. 极家装修怎么样?擅长装修简约风吗?

热门文章

  1. 面向对象案例——贪吃蛇游戏
  2. 奇迹按键精灵挂机脚本_按键精灵做连击脚本(奇迹MU战士用)
  3. linux转化大小写,linux转换大小写
  4. 2021用友YonSuite与创新企业共舞
  5. oracle 表空间自动扩展及大小
  6. 面对不同种类的处理结果——result type=
  7. 神经网络和pid有什么区别,基于神经网络的pid控制
  8. 基础九大字段改造,解除强依赖数据库设计
  9. 最有钱的省都在“争”!海洋类大学,要崛起了?
  10. 怎么把不能编辑的qlv转换成mp4