scrapy爬虫_Scrapy 爬虫完整案例-进阶篇

Scrapy 爬虫完整案例-进阶篇

1.1 进阶篇案例一

案例:爬取豆瓣电影 top250( movie.douban.com/top250 )的电影数据,并保存在 MongoDB 中。

dd46bdc0cdf62ed47d636456f38ac700.png

案例步骤:

第一步:明确爬虫需要爬取的内容。

我们做爬虫的时候,需要明确需要爬取的内容,豆瓣电影 TOP 250,我们需要抓取每一部电影的名字,电影的描述信息(包括导演、主演、电影类型等等),电影的评分,以及电影中最经典或者脍炙人口的一句话。

例如:肖申克的救赎

bd78ccdab8509d1d1a8f87d27d748dad.png

电影的名字:肖申克的救赎。

电影信息(导演:弗兰克·德拉邦特;主演:蒂姆·罗宾斯 / 摩根·弗里曼 / 鲍勃·冈顿 / 威廉姆·赛德勒 / 克兰西·布朗 / 更多...;电影类型:剧情 / 犯罪。)

豆瓣电影评分:9.6。

脍炙人口的一句话:希望让人自由。

第二步:创建爬虫项目。

在 dos下切换到目录

D:scrapy_project

6a6fc503be9fd351533e22e99fff8665.png

新建一个新的爬虫项目:scrapy startproject douban

295ef0f43233914ffb55f5aec5f4a3f1.png
8c2987ce4c650efc73b125148f2219ca.png

第三步:创建爬虫。

在 dos下切换到目录。

D:scrapy_projectdoubandoubanspiders

用命令 scrapy genspider doubanmovie "movie.douban.com" 创建爬虫。

e36584f7fd8b822fab83c84acdecce06.png

第四步: 开始前的准备工作。

(一)、在 scrapy.cfg 同级目录下创建 pycharm 调试脚本 run.py,内容如下:

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

from scrapy import cmdline

cmdline.execute("scrapy crawl doubanmovie".split())

370a95de3e6df3c3c5c7e9eafe5a5726.png
89c66108e20153ff80a67c2abe71aadf.png
1a24367b05cac19c9adcfc08026d14d1.png

(二)、修改 settings 中的 ROBOTSTXT_OBEY = True 参数为 False,因为默认为 True,就是要遵守 robots.txt 的规则, robots.txt 是遵循 Robot协议 的一个文件,它保存在网站的服务器中,它的作用是,告诉搜索引擎爬虫,本网站哪些目录下的网页不希望你进行爬取收录。在 Scrapy 启动后,会在第一时间访问网站的 robots.txt 文件,然后决定该网站的爬取范围。查看 robots.txt 可以直接网址后接 robots.txt 即可。

例如百度:https://www.baidu.com/robots.txt

修改 settings 文件。

2514bfa18cfbfddaa7e1aaa30995602b.png

(三)、settings.py 里添加 USER_AGENT。

abf447543b7f40d846cd25ef45be3c5d.png

(四)不需要模拟登陆,settings.py 里的 COOKIES_ENABLED ( Cookies中间件) 设置禁用状态。

COOKIES_ENABLED = False

4d27f23e0e980c4de2ba0211c26d1cca.png

第五步: 定义 Item,编写 items.py 文件。

import scrapy

class DoubanItem(scrapy.Item):

# 电影标题

title = scrapy.Field()

# 电影信息

bd = scrapy.Field()

# 豆瓣评分

star = scrapy.Field()

# 脍炙人口的一句话

quote = scrapy.Field()

第六步: 查看HTML源码,使用XPath helper爬虫插件一起查看需要爬取的字段的 xpath 路径。

# 电影标题

item['title'] = each.xpath(".//span[@class='title'][1]/text()").extract()[0]

93995e47fac65030da9e8f1c0e125298.png

# 电影信息

item['bd'] = each.xpath(".//div[@class='bd']/p/text()").extract()[0]

9b5f074c43a1046226b64b72fb229678.png

# 豆瓣评分

item['star'] = each.xpath(".//div[@class='star']/span[@class='rating_num']/text()").extract()[0]

dbf10e207f1f1f50ab0f0be0772a3f7c.png

# 脍炙人口的一句话

quote = each.xpath(".//p[@class='quote']/span/text()").extract()

7c74051c262ac3ec9781c1f7a82efee6.png

备注:extract()返回的是一个列表,列表里的每个元素是一个对象,extract()把这些对象转换成 Unicode 字符串。

第七步: 分析网站分页的 URL 规律。

1de2b1aeb13fd38a591c2b9cbc294f9a.png

第一页的链接地址:

https://movie.douban.com/top250?start=0

第二页的链接地址:

https://movie.douban.com/top250?start=25

最十页的链接地址:

https://movie.douban.com/top250?start=225

通过分析我们得知,每一页的的链接地址 start 的值递增 25,就是下一页的地址。

第八步: 编写爬虫文件。

import scrapy,sys,os

path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

sys.path.append(path)

from douban.items import DoubanItem

class DoubamovieSpider(scrapy.Spider):

name = "doubanmovie"

allowed_domains = ["movie.douban.com"]

offset = 0

url = "https://movie.douban.com/top250?start="

start_urls = (

url + str(offset),

)

def parse(self, response):

item = DoubanItem()

movies = response.xpath("//div[@class='info']")

for each in movies:

# 电影标题

item['title'] = each.xpath(".//span[@class='title'][1]/text()").extract()[0]

# 电影信息

item['bd'] = each.xpath(".//div[@class='bd']/p/text()").extract()[0]

# 豆瓣评分

item['star'] = each.xpath(".//div[@class='star']/span[@class='rating_num']/text()").extract()[0]

# 脍炙人口的一句话

quote = each.xpath(".//p[@class='quote']/span/text()").extract()

if len(quote) != 0:

item['quote'] = quote[0]

yield item

if self.offset < 225:

self.offset += 25

yield scrapy.Request(self.url + str(self.offset), callback = self.parse)

第九步:在settings.py文件里设置管道文件。

ITEM_PIPELINES = {

'douban.pipelines.DoubanPipeline': 300,

}

fae9a866740fb25805dab5a5cf8884ff.png

第十步:创建 MongoDB 数据库"Douban"和存放爬虫数据的表"doubanmovies"。

MongoDB中创建一个叫"Douban"的库。

ea637d478df4011ff458dfcece4c6d88.png

MongoDB 创建数据库的语法格式如下:

use DATABASE_NAME

如果数据库不存在,则创建数据库,否则切换到指定数据库。

59b583c818ff503087f056ba918625ee.png

备注:刚创建的数据库 Douban并不在数据库的列表中, 要显示它,我们需要向 Douban 数据库插入一些数据或者创建表。

创建表:db.createCollection("doubanmovies")

语法格式:

db.createCollection(name, options)

68385e5ade83a1d7862c0a4453e1c070.png

创建表完成,再去查 MongoDB 中的库就显示了 Douban 库。

5346328aafa3e79fed95ce25a06dc3c7.png

查看表:show collections

292ad7469e16c8b3f31ec6c6fbc522a6.png

第十一步:在settings.py文件里配置 MongoDB 连接配置项

# MONGODB 主机名

MONGODB_HOST = "127.0.0.1"

# MONGODB 端口号

MONGODB_PORT = 27017

# 数据库名称

MONGODB_DBNAME = "Douban"

# 存放数据的表名称

MONGODB_SHEETNAME = "doubanmovies"

5ab3a110c12bd3b7c377a498472ca520.png

第十二步: 编写 pipelines 管道文件(把数据存储到 MongoDB)。

import pymongo

from scrapy.conf import settings

class DoubanPipeline(object):

def __init__(self):

host = settings["MONGODB_HOST"]

port = settings["MONGODB_PORT"]

dbname = settings["MONGODB_DBNAME"]

sheetname= settings["MONGODB_SHEETNAME"]

# 创建MONGODB数据库链接

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

# 指定数据库

mydb = client[dbname]

# 存放数据的数据库表名

self.sheet = mydb[sheetname]

def process_item(self, item, spider):

data = dict(item)

self.sheet.insert(data)

return item

第十三步: 执行run.py文件,运行爬虫。

62c5a4e7f9347a949608ba54d9cfd888.png
7df5f247225b68856a08913aa90b97ab.png

第十四步: 查看 MongoDB 数据库

157da78592c597e01b3128a3e6be6573.png

显示的只是一部分数据(Type "it" for more),如果想看完整的数据,可以通过 MongoDB 数据库自带的图形化客户端工具(MongoDB Compass Community)查看。

210cd009f704d90fb8eed84035dd78b1.png

1.2 进阶篇案例二

案例:使用下载中间件(Downloader Middlewares)改写爬取豆瓣电影top250案例

案例步骤:

第一步:创建爬虫项目。

在 dos下切换到目录

D:scrapy_project

4b6c3d77a501e58ff273e8b5caf68ed6.png

新建一个新的爬虫项目:scrapy startproject douban2

18dfbd3b8fc7422a7dd499c0ac7a0340.png
c7dd7578efcdb3cde28d7b63e642df7e.png

第二步:创建爬虫。

在 dos下切换到目录。

D:scrapy_projectdouban2douban2spiders

用命令 scrapy genspider doubanmovie2 "movie.douban.com" 创建爬虫。

f02821e4ad4fff30190c5c97ca1028e5.png

第三步: 开始前的准备工作。

(一)、在 scrapy.cfg 同级目录下创建 pycharm 调试脚本 run.py,内容如下:

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

from scrapy import cmdline

cmdline.execute("scrapy crawl doubanmovie".split())

931ad2d431431f27f8f7846ba2645439.png
0dbf9fd039ddd7a9a2b4b1ffbf4509a4.png
96f893ee08b8f9533d77088a67ced2fa.png

(二)、修改 settings 中的 ROBOTSTXT_OBEY = True 参数为 False,因为默认为 True,就是要遵守 robots.txt 的规则, robots.txt 是遵循 Robot协议 的一个文件,它保存在网站的服务器中,它的作用是,告诉搜索引擎爬虫,本网站哪些目录下的网页不希望你进行爬取收录。在 Scrapy 启动后,会在第一时间访问网站的 robots.txt 文件,然后决定该网站的爬取范围。查看 robots.txt 可以直接网址后接 robots.txt 即可。

例如百度:https://www.baidu.com/robots.txt

修改 settings 文件。

7fbab09b6c9ae8b82efeba755cbdaa71.png

(三)不需要模拟登陆,settings.py 里的 COOKIES_ENABLED ( Cookies中间件) 设置禁用状态。

COOKIES_ENABLED = False

811bfce759da954cf787e0c6f4199b73.png

备注:截图使用的是案例一,步骤参考案例一。

第四步: 定义 Item,编写 items.py 文件。

import scrapy

class DoubanItem(scrapy.Item):

# 电影标题

title = scrapy.Field()

# 电影信息

bd = scrapy.Field()

# 豆瓣评分

star = scrapy.Field()

# 脍炙人口的一句话

quote = scrapy.Field()

第五步: 编写爬虫文件。

import scrapy,sys,os

path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

sys.path.append(path)

from douban.items import DoubanItem

class DoubamovieSpider(scrapy.Spider):

name = "doubanmovie"

allowed_domains = ["movie.douban.com"]

offset = 0

url = "https://movie.douban.com/top250?start="

start_urls = (

url + str(offset),

)

def parse(self, response):

item = DoubanItem()

movies = response.xpath("//div[@class='info']")

for each in movies:

# 电影标题

item['title'] = each.xpath(".//span[@class='title'][1]/text()").extract()[0]

# 电影信息

item['bd'] = each.xpath(".//div[@class='bd']/p/text()").extract()[0]

# 豆瓣评分

item['star'] = each.xpath(".//div[@class='star']/span[@class='rating_num']/text()").extract()[0]

# 脍炙人口的一句话

quote = each.xpath(".//p[@class='quote']/span/text()").extract()

if len(quote) != 0:

item['quote'] = quote[0]

yield item

if self.offset < 225:

self.offset += 25

yield scrapy.Request(self.url + str(self.offset), callback = self.parse)

第六步:在settings.py文件里设置管道文件。

ITEM_PIPELINES = {

'douban.pipelines.DoubanPipeline': 300,

}

8f83df969eb7bb9c875ac7a709e9ce50.png

第七步:创建 MongoDB 数据库"Douban"和存放爬虫数据的表"doubanmovies"。

MongoDB中创建一个叫"Douban"的库。

a5c78bf03fd63174d7350b854c428375.png

MongoDB 创建数据库的语法格式如下:

use DATABASE_NAME

如果数据库不存在,则创建数据库,否则切换到指定数据库。

d236e5740570ef7054df03b00cda28de.png

备注:刚创建的数据库 Douban 并不在数据库的列表中, 要显示它,我们需要向 Douban 数据库插入一些数据或者创建表。

创建表:db.createCollection("doubanmovies")

语法格式:

db.createCollection(name, options)

4f0f76c4afee9b1e54d64073dcfd9005.png

创建表完成,再去查 MongoDB 中的库就显示了 Douban 库。

c17b393785266c50bd3b2bb2419d512e.png

查看表:show collections

2a7d8d480449151bc88505d5da4b1584.png

第八步:在settings.py文件里配置 MongoDB 连接配置项

# MONGODB 主机名

MONGODB_HOST = "127.0.0.1"

# MONGODB 端口号

MONGODB_PORT = 27017

# 数据库名称

MONGODB_DBNAME = "Douban"

# 存放数据的表名称

MONGODB_SHEETNAME = "doubanmovies"

86d8abb662f6ac5f9b8cdeeefd04b14e.png

第九步: 编写 pipelines 管道文件(把数据存储到 MongoDB)。

import pymongo

from scrapy.conf import settings

class DoubanPipeline(object):

def __init__(self):

host = settings["MONGODB_HOST"]

port = settings["MONGODB_PORT"]

dbname = settings["MONGODB_DBNAME"]

sheetname= settings["MONGODB_SHEETNAME"]

# 创建MONGODB数据库链接

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

# 指定数据库

mydb = client[dbname]

# 存放数据的数据库表名

self.sheet = mydb[sheetname]

def process_item(self, item, spider):

data = dict(item)

self.sheet.insert(data)

return item

第十步: 在settings.py文件里添加下载中间件(Downloader Middlewares)字段。

DOWNLOADER_MIDDLEWARES = {

'douban.middlewares.RandomUserAgent': 100,

'douban.middlewares.RandomProxy': 200,

}

USER_AGENTS = [

'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)',

'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)',

'Opera/9.27 (Windows NT 5.2; U; zh-cn)',

'Opera/8.0 (Macintosh; PPC Mac OS X; U; en)',

'Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0',

'Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; M032 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',

'Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13'

]

PROXIES = [

{"ip_port" :"121.42.140.113:16816

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值