最近在学python,对python爬虫框架十分着迷,因此在网上看了许多大佬们的代码,经过反复测试修改,终于大功告成!

原文地址是:https://blog.csdn.net/ljm_9615/article/details/76694188

我的运行环境是win10,用的是python3.6,开发软件pycharm

1.创建项目

cmd进入你要创建的目录下面,scrapy startproject doubanmovie

用pycharm打开,目录如下:

#在spiders文件夹下编写自己的爬虫

#在items中编写容器用于存放爬取到的数据

#在pipelines中对数据进行各种操作

# 在settings中进行项目的各种设置

2.编写代码

在items编写数据对象方便对数据操作管理,代码如下

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html import scrapy class MovieItem(scrapy.Item):
# 电影名字
name = scrapy.Field()
# 电影信息
info = scrapy.Field()
# 评分
rating = scrapy.Field()
# 评论人数
num = scrapy.Field()
# 经典语句
quote = scrapy.Field()
# 电影图片
img_url = scrapy.Field()
#序号
id_num = scrapy.Field()

在spiders下面创建my_spider.py文件,完整代码如下:

import scrapy

from doubanmovie.items import MovieItem

class DoubanMovie(scrapy.Spider):
# 爬虫唯一标识符
name = 'doubanMovie'
# 爬取域名
allowed_domain = ['movie.douban.com']
# 爬取页面地址
start_urls = ['https://movie.douban.com/top250'] #def parse(self, response):
# print(response.body)
def parse(self, response):
selector = scrapy.Selector(response)
# 解析出各个电影
movies = selector.xpath('//div[@class="item"]')
# 存放电影信息
item = MovieItem() for movie in movies: # 电影各种语言名字的列表
titles = movie.xpath('.//span[@class="title"]/text()').extract()
# 将中文名与英文名合成一个字符串
name = ''
for title in titles:
name += title.strip()
item['name'] = name # 电影信息列表
infos = movie.xpath('.//div[@class="bd"]/p/text()').extract()
# 电影信息合成一个字符串
fullInfo = ''
for info in infos:
fullInfo += info.strip()
item['info'] = fullInfo
# 提取评分信息
item['rating'] = movie.xpath('.//span[@class="rating_num"]/text()').extract()[0].strip()
# 提取评价人数
item['num'] = movie.xpath('.//div[@class="star"]/span[last()]/text()').extract()[0].strip()[:-3]
# 提取经典语句,quote可能为空
quote = movie.xpath('.//span[@class="inq"]/text()').extract()
if quote:
quote = quote[0].strip()
else:
quote = 'null'
item['quote'] = quote
# 提取电影图片
item['img_url'] = movie.xpath('.//img/@src').extract()[0]
item['id_num'] = movie.xpath('.//em/text()').extract()[0]
yield item next_page = selector.xpath('//span[@class="next"]/a/@href').extract()
if next_page:
url = 'https://movie.douban.com/top250' + next_page[0]
yield scrapy.Request(url, callback=self.parse)

在pipelines.py操作数据

用json格式文件输出爬取到的电影信息

class DoubanmoviePipeline(object):
def __init__(self):
# 打开文件
self.file = open('data.json', 'w', encoding='utf-8') # 该方法用于处理数据
def process_item(self, item, spider):
# 读取item中的数据
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
# 写入文件
self.file.write(line)
# 返回item
return item # 该方法在spider被开启时被调用。
def open_spider(self, spider):
pass # 该方法在spider被关闭时被调用。
def close_spider(self, spider):
self.file.close()

爬取图片并保存到本地

class ImagePipeline(ImagesPipeline):
def get_media_requests(self, item, info):
yield scrapy.Request(item['img_url']) def item_completed(self, results, item, info):
image_paths = [x['path'] for ok, x in results if ok] if not image_paths:
raise DropItem("Item contains no images") item['img_url'] = image_paths
return item

爬取信息写入数据库,我用的mysql数据库做测试

class DBPipeline(object):
def __init__(self):
# 连接数据库
self.connect = pymysql.connect(
host=settings.MYSQL_HOST,
port=3306,
db=settings.MYSQL_DBNAME,
user=settings.MYSQL_USER,
passwd=settings.MYSQL_PASSWD,
charset='utf8',
use_unicode=True) # 通过cursor执行增删查改
self.cursor = self.connect.cursor(); def process_item(self, item, spider):
try:
self.cursor.execute(
"""insert into doubanmovie(name, info, rating, num ,quote, img_url,id_num)
value (%s, %s, %s, %s, %s, %s,%s)""",
(item['name'],
item['info'],
item['rating'],
item['num'],
item['quote'],
item['img_url'],
item['id_num']
))
# 提交sql语句
self.connect.commit()
except Exception as error:
# 出现错误时打印错误日志
log(error)
return item

在settings.py添加

#防止爬取被禁,报错403forbidden

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'
#如果爬取过程中又出现问题:Forbidden by robots.txt 将ROBOTSTXT_OBEY改为False,让scrapy不遵守robot协议,即可正常下载图片
ITEM_PIPELINES = {
'doubanmovie.pipelines.DoubanmoviePipeline': 1,
'doubanmovie.pipelines.ImagePipeline': 100,
'doubanmovie.pipelines.DBPipeline': 10,
}
数字1表示优先级,越低越优先 IMAGES_STORE = 'E:\\img\\'
#自定义图片存储路径 MYSQL_HOST = 'localhost'
MYSQL_DBNAME = 'douban'
MYSQL_USER = 'root'
MYSQL_PASSWD = '0000'
#数据库配置

3.报错问题

基本上报错都是缺少这个或那个文件造成的,网上搜一搜就能找到!

部分报错是由于看了不同大佬代码,导致一些逻辑错误,根据报错提示很轻松就能解决!

完整项目:https://github.com/theSixthDay/doubanmovie.git

scrapy爬取豆瓣电影信息的更多相关文章

  1. scrapy爬取豆瓣电影top250

    # -*- coding: utf-8 -*- # scrapy爬取豆瓣电影top250 import scrapy from douban.items import DoubanItem class ...

  2. python爬取豆瓣电影信息数据

    题外话+ 大家好啊,最近自己在做一个属于自己的博客网站(准备辞职回家养老了,明年再战)在家里 琐事也很多, 加上自己 一回到家就懒了(主要是家里冷啊! 广东十几度,老家几度,躲在被窝瑟瑟发抖,) 由于 ...

  3. Scrapy爬取豆瓣电影top250的电影数据、海报,MySQL存储

    从GitHub得到完整项目(https://github.com/daleyzou/douban.git) 1.成果展示 数据库 本地海报图片 2.环境 (1)已安装Scrapy的Pycharm (2 ...

  4. 爬取豆瓣电影信息保存到Excel

    from bs4 import BeautifulSoup import requests import html.parser from openpyxl import Workbook,load_ ...

  5. Scrapy中用xpath/css爬取豆瓣电影Top250:解决403HTTP status code is not handled or not allowed

    好吧,我又开始折腾豆瓣电影top250了,只是想试试各种方法,看看哪一种的方法效率是最好的,一直进行到这一步才知道 scrapy的强大,尤其是和selector结合之后,速度飞起.... 下面我就采用 ...

  6. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  7. scrapy爬虫框架教程(二)-- 爬取豆瓣电影

    前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大家讲解一个完整爬虫的流程. 工具和环境 语言:python 2 ...

  8. Scrapy实战篇(三)之爬取豆瓣电影短评

    今天的主要内容是爬取豆瓣电影短评,看一下网友是怎么评价最近的电影的,方便我们以后的分析,以以下三部电影:二十二,战狼,三生三世十里桃花为例. 由于豆瓣短评网页比较简单,且不存在动态加载的内容,我们下面 ...

  9. urllib+BeautifulSoup无登录模式爬取豆瓣电影Top250

    对于简单的爬虫任务,尤其对于初学者,urllib+BeautifulSoup足以满足大部分的任务. 1.urllib是Python3自带的库,不需要安装,但是BeautifulSoup却是需要安装的. ...

随机推荐

  1. 线上Redis高并发性能调优实践

    项目背景 最近,做一个按优先级和时间先后排队的需求.用 Redis 的 sorted set 做排队队列. 主要使用的 Redis 命令有, zadd, zcount, zscore, zrange ...

  2. 2020HC大会上,这群人在讨论云原生…

    启程 一年一度的华为全联接大会又开启了,伴随着一封来自华为全联接大会的邀请函,我来到了2020华为全联接大会的现场. 理解 今年,华为全联接大会的主题是:共 创 行 业 新 价 值!(NEW VALU ...

  3. mysql-2-where

    #进阶2:条件查询 /* 语法: SELECT 查询列表 FROM 表名 WHERE 筛选条件 分类: 1.按条件表达式筛选:> < = != <> >= <= 2 ...

  4. Eclipse 重命名工程、包、类

    Eclipse版本 重命名工程,使用鼠标右键点击工程,选Refactor > Rename...(快捷键:Alt + Shift + R) 重命名包.类的操作与重命名工程一样. 其实,最简单的操 ...

  5. 【学习笔记/题解】分层图/[JLOI2011]飞行路线

    题目戳我 \(\text{Solution:}\) 关于分层图: 一般用于处理:给你\(k\)次机会对边权进行修改的最短路问题. 算法流程: 建立出\(k\)层图,对应进行\(k\)次操作后的局面. ...

  6. 【题解】CF413C Jeopardy!

    \(\color{blue}{Link}\) \(\text{Solution:}\) 首先,显然的策略是把一定不能翻倍的先加进来.继续考虑下一步操作. 考虑\(x,y\)两个可以翻倍的物品,且\(a ...

  7. vue实现语音播报功能

    1,创建一个js文件 (voicePrompt.js) function voicePrompt (text){ new Audio('http://tts.baidu.com/text2audio? ...

  8. JavaScript格式化返回当前日期和时间

    要求: 返回当前日期和时间,如 2020年10月06日 星期二 下午08点15分35秒 代码实现: function getDate() { var date = new Date(); var ye ...

  9. 简说Modbus-RTU与Modbus-ASCII

    Modbus在串行总线通信中的协议有RTU和ASCII两种.RTU是Remote Terminal Unit的缩写,意思是远程终端单元.ASCII是American Standard Code for ...

  10. python中remove函数的坑

    摘要:对于python中的remove()函数,官方文档的解释是:Remove first occurrence of value.大意也就是移除列表中等于指定值的第一个匹配的元素. 常见用法: a ...