最近在学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. 和低效 IO 说再见,回头补一波 Java 7 的 NIO.2 特性

    其实在这之前已经写过一篇关于 Java 7 的新特性文章了,那篇文章主要介绍了 Java 7 的资源自动关闭.Switch String 实现原理.异常捕获 try-catch.新的二进制书写方式等, ...

  2. Dotnet Core IHttpClientFactory深度研究

    今天,我们深度研究一下IHttpClientFactory.   一.前言 最早,我们是在Dotnet Framework中接触到HttpClient. HttpClient给我们提供了与HTTP交互 ...

  3. EM 算法 Expectation Maximization

  4. 在C++中使用libuv时对回调的处理 (2)

    前情简介 在完成了第一版的<在C++中使用libuv时对回调的处理>之后,在对项目进行开发的时候,还是感觉有一些难受. 因为在实际操作的时候,需要构建一个结构体,并且需要对这个结构体的内存 ...

  5. 批处理文件的@echo off

    转载:https://blog.csdn.net/zl1zl2zl3/article/details/79218448  @echo off  关闭回显     @echo on  打开回显      ...

  6. Go 接口类型

    接口作用 Go语言中的接口是一种类型,类似于Python中的抽象基类. Go语言中使用接口来体现多态,是duck-type的一种体现. 如,只要一个东西会叫,会走,那么我们就可以将它定义为一个动物的接 ...

  7. 在java中使用SFTP协议安全的传输文件

    本文介绍在Java中如何使用基于SSH的文件传输协议(SFTP)将文件从本地上传到远程服务器,或者将文件在两个服务器之间安全的传输.我们先来了解一下这几个协议 SSH 是较可靠,专为远程登录会话和其他 ...

  8. linux查看进程内存使用情况,以及将线程情况输出文件

    用jmap把进程内存使用情况dump到文件中,再用jhat分析查看.jmap进行dump命令格式如下: jmap -dump:format=b,file=/tmp/dump.dat 21711  -- ...

  9. mycat相关配置文件和参数解析

    #vi /usr/local/mycat/conf/schema.xml<!--######################################################### ...

  10. springboot1.5和jpa利用HikariCP实现多数据源的使用

    背景 现在已有一个完整的项目,需要引入一个新的数据源,其实也就是分一些请求到从库上去 技术栈 springboot1.5 (哎,升不动啊) 思路 两个数据源,其中一个设置为主数据源 两个事物管理器,其 ...