首先需要对目标网站进行分析,具体的分析这里不详细介绍。目标网站;豆瓣某个电影评论页面 https://movie.douban.com/subject/1292052/reviews,这个电影是肖申克的救赎。网页没有使用什么特殊的加载方式,所有的评论数据都在当前的源码中。翻页:

https://movie.douban.com/subject/1292052/reviews?start=0

https://movie.douban.com/subject/1292052/reviews?start=20

https://movie.douban.com/subject/1292052/reviews?start=40

以此类推,修改start的值就可以实现翻页,数字为电影的ID,如果想要抓取不同的电影评论,只需要替换掉电影ID即可。

1.settings.py配置文件

import os

BOT_NAME = 'douban'

SPIDER_MODULES = ['douban.spiders']

NEWSPIDER_MODULE = 'douban.spiders'

ROBOTSTXT_OBEY = False

DEFAULT_REQUEST_HEADERS = {

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

'Accept-Language': 'en',

'User-Agent': 'User-AgentMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0'

}

# 注册自定义中间件SeleniumMiddleware

DOWNLOADER_MIDDLEWARES = {

'douban.middlewares.SeleniumMiddleware': 543,

}

LOG_LEVEL='ERROR'

# 注册管道

ITEM_PIPELINES = {

'douban.pipelines.DoubanPipeline': 300,

}

# 设置Selenium超时时间

SELENIUM_TIMUOUT = 30

# 设置为selenim抓取

USE_SELENIUM = True

# 设置配置文件conf.ini路径信息

BASE_DIR = os.path.dirname(os.path.realpath(__file__))

CONF = os.path.join(BASE_DIR, 'conf.ini')

# 数据库连接信息

MYSQL_CONNECTION = 'mysql+pymysql://root:123@localhost/spider?charsetutf8mb4'

配置settings.py主要用于修改功能配置文件,conf.ini文件在settings.py同级目录下

数据库连接编码使用utf8mb4是为了保证数据能完全录入数据库,因为电影评论里可能出现某些特殊字符

2.items.py文件

将需要存储的字段定义在items.py中:

import scrapy

class DoubanItem(scrapy.Item):

# 电影ID

movieId = scrapy.Field()

# 电影评论内容

comment = scrapy.Field()

3.pipelines.py文件

在管道里面定义数据存储的代码。这里使用SQLAlchemy框架,将数据存储到MySQL数据库中。

from sqlalchemy import *

from sqlalchemy.orm import sessionmaker

from sqlalchemy.ext.declarative import declarative_base

# 导入setting配置信息

from scrapy.utils.project import get_project_settings

settings = get_project_settings()

# 定义映射类

Base = declarative_base()

class scrapy_db(Base):

__tablename__ = 'douban_db'

id = Column(Integer(), primary_key=True)

movieId = Column(Integer)

comment = Column(String(2000))

class DoubanPipeline:

def __init__(self):

# 初始化连接数据库

connection = settings['MYSQL_CONNECTION']

engine = create_engine(connection, echo=False, pool_size=2000)

DBSession = sessionmaker(bind=engine)

self.SQLsession = DBSession()

# 创建数据库

Base.metadata.create_all(engine)

def process_item(self, item, spider):

# 入库处理

self.SQLsession.execute(scrapy_db.__table__.insert(), {'comment': item['comment'], 'movieId': item['movieId']})

self.SQLsession.commit()

return item

4.middlewares.py文件

删掉原来scrapy默认的中间件,定义SeleniumMiddleware中间件,将selenium处理后的数据作为response返回:

# 自定义中间件SeleniumMiddleware

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.support.ui import WebDriverWait

from scrapy.http import HtmlResponse

class SeleniumMiddleware(object):

def __init__(self, timeout=None):

self.timeout = timeout

self.options = Options()

self.options.binary_location = r'D:\Chrome\chrome.exe'

self.options.add_argument('--headless')

self.driver = webdriver.Chrome(options=self.options)

self.wait = WebDriverWait(self.driver, self.timeout)

def process_item(self, request, spider):

try:

self.driver.get(request.url)

return HtmlResponse(url=request.url,

body=self.driver.page_source,

request=request,

encoding='utf-8',

status=200)

except Exception as e:

return HtmlResponse(url=request.url, status=502, request=request)

def __del__(self):

self.driver.close()

@classmethod

def from_crawler(cls, crawler):

# 读取settings.py的SELENIUM_TIMEOUT

return cls(timeout=crawler.settings.get('SELENIUM_TIMEOUT'))

5.spider.py文件

电影评论页的URL地址带有电影ID,只要切换不同的ID就能爬取不同电影的评论。我们将电影ID写入配置文件conf.ini,再由spider程序读取并实现不同电影的评论爬取

import scrapy

import configparser

from scrapy.selector import Selector

from douban.items import DoubanItem

class MovieSpider(scrapy.Spider):

name = 'movie'

allowed_domains = ['douban.com']

start_urls = 'https://movie.douban.com/subject/%s/reviews?start=%s'

# 重写start_requests方法

def start_requests(self):

# 读取配置文件,获取电影ID

conf = configparser.ConfigParser()

urls_list = []

# 获取conf.ini的路径

conf.read(self.settings.get('CONF'))

tem = conf['config']

if 'movieId' in tem.keys():

urls_list = conf['config']['movieId'].split(',')

for i in urls_list:

# 爬取电影评论

for page in range(100):

url = self.start_urls % (str(i), str(page*20))

yield scrapy.Request(url=url, meta={'movieId': str(i)}, callback=self.parse)

def parse(self, response):

# 将响应内容内容生成Selector对象,用于数据清洗

se = Selector(response)

item = DoubanItem()

comment = se.xpath('//div[contains(@class,"main review-item")]')

for i in comment:

item['movieId'] = response.meta['movieId']

content = i.xpath('./div/div/div//text()').extract()

item['comment'] = ''.join([q.strip() for q in content if len(q.strip()) > 0]).replace('\n', '')

yield item

conf.ini配置文件主要存放电影ID,不同电影ID之间需要用逗号隔开

[config]

movieId=1292052,1292052

由于豆瓣的影评使用了JS,代码只能抓取部分影评信息,如果想要抓取全部信息就需要使用Splash解析。

未经允许不得转载:作者:鳄鱼君,

转载或复制请以 超链接形式 并注明出处 鳄鱼君。

python selenium爬虫豆瓣_Scrapy+Selenium爬取豆瓣电影评论相关推荐

  1. Python网络爬虫:利用正则表达式爬取豆瓣电影top250排行前10页电影信息

    在学习了几个常用的爬取包方法后,转入爬取实战. 爬取豆瓣电影早已是练习爬取的常用方式了,网上各种代码也已经很多了,我可能现在还在做这个都太土了,不过没事,毕竟我也才刚入门-- 这次我还是利用正则表达式 ...

  2. Python网络爬虫实战练习:爬取豆瓣图书信息

    一.注意事项 1.文件名尽量使用英文,避免出现编码问题 2.含中文的文件写入,注意标注编码,如: with open(r"C:\Users\10335\Desktop\response.tx ...

  3. Python网络爬虫实战12:爬取豆瓣电影中热门电影数据

    代码实例 # coding:utf8 import json import requests from bs4 import BeautifulSoup import openpyxlwb = ope ...

  4. Python爬虫入门 | 7 分类爬取豆瓣电影,解决动态加载问题

      比如我们今天的案例,豆瓣电影分类页面.根本没有什么翻页,需要点击"加载更多"新的电影信息,前面的黑科技瞬间被秒--   又比如知乎关注的人列表页面:   我复制了其中两个人昵称 ...

  5. python爬虫(一)爬取豆瓣电影排名前50名电影的信息

    python爬虫(一)爬取豆瓣电影排名前50名电影的信息 在Python爬虫中,我们可以使用beautifulsoup对网页进行解析. 我们可以使用它来爬取豆瓣电影排名前50名的电影的详细信息,例如排 ...

  6. Python爬虫菜鸟入门,爬取豆瓣top250电影 (自己学习,如有侵权,请联系我删除)

    Python爬虫菜鸟入门,爬取豆瓣top250电影 (自己学习,如有侵权,请联系我删除) import requests from bs4 import BeautifulSoup import ti ...

  7. 使用python的scrapy框架简单的爬取豆瓣读书top250

    使用python的scrapy框架简单的爬取豆瓣读书top250 一.配置scrapy环境 1. 配置相应模块 如果没有配置过scrapy环境的一般需要安装lxml.PyOpenssl.Twisted ...

  8. python项目开发案例集锦 豆瓣-Python第三个项目:爬取豆瓣《哪吒之魔童降世》 短评...

    前面爬完网站信息图片之后,今天的又有了个小目标,最近的电影哪吒很火,去豆瓣上看了一下 影评,决定了今天主要是实现Python第三个项目:爬取豆瓣<哪吒之魔童降世> 短评,然后下载在exce ...

  9. Python 小小爬虫练手,爬取自己的IP

                 Python 小小爬虫练手,爬取自己的IP import re import urllib.request url="http://2020.ip138.com/i ...

  10. python爬虫——用Scrapy框架爬取阳光电影的所有电影

    python爬虫--用Scrapy框架爬取阳光电影的所有电影 1.附上效果图 2.阳光电影网址http://www.ygdy8.net/index.html 3.先写好开始的网址 name = 'yg ...

最新文章

  1. Spring事务管理--(一)数据库事务隔离级别与mysql引擎基础讲解
  2. asp.net core选项配置的研究
  3. stm32篇--系统初始化
  4. 约瑟夫环问题(vector模拟过程)
  5. linux vim五则运算编程,第3章--vi-vim编辑器的使用.ppt
  6. Debian 系统安装 Nagios 服务器监控端
  7. qt linux 添加库文件路径,Linux下Qt调用共享库文件.so
  8. 定时器驱动数码管c语言程序,74hc595驱动数码管时间程序
  9. vfork()系统调用
  10. table表格for循环绑定数据_.NET MVC 页面表格绘制
  11. 从零基础入门Tensorflow2.0 ----六、28 深度可分离卷积神经网络
  12. java抛出自定义异常_令Java程序员头疼的异常报错,你遇到过哪些?
  13. Android通讯录程序设计报告,Android个人通讯录课程设计报告.doc
  14. 如何用计算机观看电视节目,如何将计算机显示器变成电视以观看节目
  15. CS1.6自定义游戏中的H菜单和设置菜单,增加一键买枪功能
  16. stata基于cox回归制作临床决策曲线
  17. vivado和modelsim联合仿真,提示giving up waiting on lock,error:verilog compiler exiting解决方法
  18. windows GDI+ 绘图的简单封装
  19. python实现八边形绘制
  20. 跟我学Linux系统管理 第三讲 磁盘管理

热门文章

  1. (数组)88. 合并两个有序数组(java)
  2. 经典算法——直接插入排序
  3. 锂电池充放电电路设计与分析
  4. 女生学大数据好找工作么
  5. 月薪5万 微软中国研究院 最新面试题
  6. MyCAT读写分离分库分表
  7. linux中的ps fx命令,Linux下ps命令详解 Linux下ps命令的详细使用方法
  8. SEO网站内容页优化,TDK关键词排名优化
  9. 驻极体话筒的正常工作电压是多少?
  10. Linux程序下载到板子上,uclinux系统移植到bf561板子上过程