七仔的博客

七仔的博客GithubPages分博

0%

Scrapy豆瓣整站爬虫

Scrapy豆瓣整站爬虫,爬取豆瓣下电影、读书、音乐、同城四个分类的数据并保存到MySQL,文末有源码

Scrapy豆瓣整站爬虫

分析:

豆瓣的分类有这些

豆瓣分类截图

其中读书、电影、音乐、同城的四个分类信息较多、维度较全,我们今天就来爬取这四个分类下的数据

豆瓣电影:

豆瓣电影下的分类导航是最全的,默认选择全部

豆瓣电影1

拉到下面点击更多

豆瓣电影2

在F12开发者工具可以看到

F12开发者工具

一共出来了21条请求,其中20条是图片,第一条是返回的json数据

返回数据

分析这条GET请求

https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=20

range经测试并没有什么用惊讶,后面的start可以按20的倍数增长

不过json数据并不是很全,所以需要进每条的详情页也就是

url

https://movie.douban.com/subject/1292720

电影详情

在详情页可以采集到比较详细的数据

我们可以这样设计需要采集的数据

需要采集的数据

经过测试发现有的电影并没有详情页,所以需要将之前的json数据放进去,毕竟也是有点信息的,为了偷懒,我设计爬虫为两次爬取,每次注释一部分代码运行

豆瓣读书:

豆瓣读书按标签可以得到排行(https://book.douban.com/tag/%E5%B0%8F%E8%AF%B4?start=980&type=T)替换标签就可以

豆瓣读书

全部标签页为(https://book.douban.com/tag/

需要注意的是页数显示382页

页数

实际上在页数等于51页(也就是数据量等于1000)的时候,豆瓣就会显示

没有找到

很迷擦汗

操作依据上面电影的双向爬取来就行

需要注意的是详情在html显示是酱紫:

html结果

信息不在标签里拍头

我的处理方法是将整个的 “”.join() 放在一个字符串里,然后正则表达式 作者:(.+?)出版社: 就可以提取出来中间的信息

豆瓣音乐和豆瓣同城的分析和上面的差不多,这里就不分析了

代码:

具体的源码我会放在最下面,这里讲解一下怎么将这四个爬虫放在一个项目里

首先是Items.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# -*- coding: utf-8 -*-

from scrapy.item import Item, Field


class DoubanVideoItem(Item):
id = Field() # 在豆瓣的ID
name = Field() # 电影名
image_url = Field() # 海报
director = Field() # 导演
screenwriter = Field() # 编剧
star = Field() # 主演
genre = Field() # 类型
runtime = Field() # 片长
initialReleaseDate = Field() # 首次上映日期
summary = Field() # 简介
average_count = Field() # 评价数量
average = Field() # 评分
star_1 = Field() # 一星占比
star_2 = Field() # 二星占比
star_3 = Field() # 三星占比
star_4 = Field() # 四星占比
star_5 = Field() # 五星占比


class DoubanBookItem(Item):
id = Field() # 在豆瓣的ID
name = Field() # 书名
image_url = Field() # 封面
author = Field() # 作者
press = Field() # 出版社
year = Field() # 出版年
pages = Field() # 页数
price = Field() # 定价
bindinglayout = Field() # 装帧
series = Field() # 丛书
ISBN = Field() # ISBN
summary = Field() # 简介
average_count = Field() # 评价数量
average = Field() # 评分
star_1 = Field() # 一星占比
star_2 = Field() # 二星占比
star_3 = Field() # 三星占比
star_4 = Field() # 四星占比
star_5 = Field() # 五星占比

...下面的差不多

然后在setting.py中设置

1
2
3
4
5
6
ITEM_PIPELINES = {
'DouBanAll.pipelines.DoubanVideoPipeline': 100,
'DouBanAll.pipelines.DoubanBookPipeline': 200,
'DouBanAll.pipelines.DoubanMusicPipeline': 300,
'DouBanAll.pipelines.DoubanLocationPipeline': 400,
}

然后每新建一个爬虫,就在spiders目录下 scrapy genspider 爬虫名 web 一个新的爬虫名.py

爬虫中需要添加

1
2
3
custom_settings = {
'ITEM_PIPELINES' : {'DouBanAll.pipelines.DoubanVideoPipeline': 100}
}

来区分

然后运行爬虫时:

1
scrapy crawl 爬虫名

源代码:

点击此处下载

此为博主副博客,留言请去主博客,转载请注明出处:https://www.baby7blog.com/myBlog/26.html

欢迎关注我的其它发布渠道