前期工作:
安装 Python 3 之后,使用如下命令安装 Scrapy 框架
pipinstall scrapy
创建你的 Scrapy 项目
scrapystartproject douban
到 spider 目录下生成你的爬虫
scrapy genspider spider_db movie.douban.com/top250
项目结构如下:
开始爬虫:
目标:
咱们要获取的数据有以下6个:电影排名、电影名称、电影简介、 电影评分、打分人次、电影名言。
1. 老规矩,第一步现在Items中定义我们要爬取的字段名称。
mv_no = scrapy.Field()# 电影排名
mv_name = scrapy.Field()# 电影名称
mv_introduce = scrapy.Field()# 电影简介
mv_score = scrapy.Field()# 电影评分
mv_person = scrapy.Field()# 打分人次
mv_quote = scrapy.Field()# 电影名言
2. 第二步我们在spider类中自定义我们的爬虫方法,在此之前先要分析网页。
下图可以看出,每一部电影对应的信息都在一个li标签之内,所以我们先用xpath来获取当前页面的25个li标签。
# 获取所有的li标签
lis = response.xpath('//*[@id="content"]/div/div/ol/li')
print(len(lis))
'''
25
'''
3. 成功的获取到了当前页面所有的电影信息之后,接下来我们在用xpath来获取电影排名、电影名称、电影简介、 电影评分、打分人次、电影名言等具体信息。
在这里大家可以使用xpath插件Xpath-Helper可以非常方便地获取xpath路径。最后把获取到的数据扔给pipeline即可。
forliinlis:
item['mv_no'] = li.xpath('./div/div/em/text()').get()
mv_name = li.xpath("./div/div[2]/div[1]/a/span/text()").getall()
item['mv_name'] =''.join(mv_name)
mv_introduce = li.xpath('./div/div[2]/div[2]/p[1]/text()[2]').get()
mv_introduce = mv_introduce.strip()
item['mv_introduce'] =''.join(mv_introduce)
item['mv_score'] = li.xpath("./div/div[2]/div[2]/div/span[2]/text()").get()
item['mv_person'] = li.xpath("./div/div[2]/div[2]/div/span[4]/text()").get()
item['mv_quote'] = li.xpath('./div/div[2]/div[2]/p[2]/span/text()').get()
yielditem
4. 我们先来打印一下看数据是否如我们所需。
print(item['mv_no'])
print(item['mv_name'])
print(item['mv_introduce'])
print(item['mv_score'])
print(item['mv_person'])
print(item['mv_quote'] +'\n')
可以看到第一页的25条数据已经成功获取到。
6. 接下来我们的目的很简单,把数据存入mongodb。
6.1 mongodb的下载传送门:
https://www.mongodb.com/try/download/community
直接点击download即可下载。
6.2 双击打开文件进行安装,在安装过程中,可以通过点击 "Custom(自定义)" 按钮来设置你的安装目录。
6.3 这里我选择安装在E:\MongoDB这个目录下(安装目录会影响我们后面的配置)。
6.4 这里选择直接next:
6.5 这里安装 "Install MongoDB Compass" 不勾选,否则可能要很长时间都一直在执行安装,MongoDB Compass是一个图形界面管理工具,这里不安装也是没有问题的,可以自己去下载一个图形界面管理工具,比如Robo3T。
之后稍微等待一会就安装好了。
6.6 最新mongodb无需繁琐配置,去浏览器访问:
http://127.0.0.1:27017/
出现下图
Itlooks like you are trying to access MongoDB over HTTPonthe native driver port.
证明MongoDB服务开启成功!
或者按照如下方式手动开启mongodb服务。
7. 接下来我们就需要将数据存入mongodb。进入到mongdb安装路径bin目录下,查看MongoDB 的端口号,找到这一条
connectiong to mongodb://127.0.0.1:27017
然后到 settings.py 中写如下参数:
mongo_host='127.0.0.1'
mongo_port =27017
mongo_db_name ='douban'
mongo_db_collection ='doubanTop250'
8. 记得在pipeline中进行如下设置,导入设置的参数等。
def__init__(self):
host = mongo_host
port = mongo_port
dbname = mongo_db_name
collection = mongo_db_collection
client = pymongo.MongoClient(host=host, port = port)
db = client[dbname]
self.post = db[collection]
defprocess_item(self, item, spider):
print(item['mv_no'])
print(item['mv_name'])
print(item['mv_introduce'])
print(item['mv_score'])
print(item['mv_person'])
print(item['mv_quote'] +'\n')
data = dict(item)
self.post.insert(data)
returnitem
接下来我们试试看数据是否能导入到mongodb中,运行一下项目看一看数据库中是否存在我们想要的信息。
此时 douban 就可以找到,然后切换到这个数据库使用use douban 这个命令。
然后显示我们的数据集,名字就是我们再 setting.py 中写的 mongodbname = 'douban'和 mongodbcollection = 'doubanTop250'这两条。
为方便起见,我们后续使用mongodb的可视化工具Studio 3T来查看数据,下载传送门在此:
https://studio3t.com/
傻瓜式安装,一路next。在此不再赘述,有问题的小伙伴可自行百度一下。
下载完成之后连接方式如下:
查看数据:
搞定!
9. 25条搞定,那250条数据就很简单了。接下来我们要做的就是爬取多页数据,在这里我们使用简单的for循环即可。
forpageinrange(1,10+1):
url =f'https://movie.douban.com/top250?start={(page-1)*25}&filter='
yieldscrapy.Request(url, callback=self.parse)
再来试试250条数据的获取。
250条数据已经成功获取到mongodb中,有什么问题,欢迎各路老板留言!