Python | 数据采集练习之抓取豆瓣书籍Top250

数据来源:

豆瓣图书 Top 250

目标描述:

建立一个爬虫项目,抓取豆瓣读书Top 250页面的250本书的信息,采集字段包括:

  • 书的图片
  • 书名
  • 作者
  • 出版社
  • 价格
  • 评分
  • 简介

开始爬虫

1.新建项目

scrapy startproject douban

进入项目

cd douban

2.编写item.py文件,定义将要爬取的字段

import scrapy

class DoubanItem(scrapy.Item):
    img = scrapy.Field() # 书的图片地址
    book_name = scrapy.Field() # 书名
    english_name = scrapy.Field() # 英文名
    author = scrapy.Field() # 作者
    publish = scrapy.Field() # 出版社
    price = scrapy.Field() # 价格
    score = scrapy.Field() # 评分
    description = scrapy.Field() # 简介 
    pass

3.创建并编写doubanspider.py文件

通过css选择路径:

# -*- coding: utf-8 -*-
import scrapy
from douban.items import DoubanItem

class DoubanspiderSpider(scrapy.Spider):
    name = 'doubanspider'
    # allowed_domains = ['https://www.douban.com/']
    start_urls = ['https://book.douban.com/top250',]

    def parse(self, response):
        for book in response.css('tr.item'):
            item = DoubanItem()
            item['img'] = book.css('a.nbg img::attr(src)').extract_first()
            item['book_name'] = book.css('div.pl2 a::attr(title)').extract()
            item['english_name'] = book.css('div.pl2 span::text').extract_first()
            item['author'] = book.css('p.pl::text').extract_first().split('/')[0]
            item['publish'] = book.css('p.pl::text').extract_first().split('/')[-3]
            item['price'] = book.css('p.pl::text').extract_first().split('/')[-1]
            item['score'] = book.css('div.star.clearfix span.rating_nums::text').extract_first()
            item['description'] = book.css('p.quote span.inq::text').extract_first()
            yield item

            next_link = response.css("div.paginator span.next a::attr(href)").extract_first() # 得到下一页网址的起始数字
            # 查看是否有下一页
            if next_link is not None:
                next_link = next_link.split('?')[-1]
                next_page = '?' + next_link
                next_page = response.urljoin(next_page)  # 生成下一页的链接
                yield scrapy.Request(next_page,callback=self.parse) # 访问下一页

通过xpath选择路径:

import scrapy
from douban.items import DoubanItem

class DoubanspiderSpider(scrapy.Spider):
    name = 'doubanspider'
    # allowed_domains = ['https://www.douban.com/']
    start_urls = ['https://book.douban.com/top250',]

    def parse(self, response):
        for book in response.xpath(".//div[@class='article']//table"):
            item = DoubanItem()
            item['img'] = book.xpath(".//a/img/@src").extract_first()
            item['book_name'] = book.xpath(".//div[@class='pl2']/a/@title").extract_first().strip()
            item['english_name'] = book.xpath(".//div[@class='pl2']/span/text()").extract()
            item['author'] = book.xpath(".//p[@class='pl']/text()").extract_first().split('/')[0]
            item['publish'] = book.xpath(".//p[@class='pl']/text()").extract_first().split('/')[-3]
            item['price'] = book.xpath(".//p[@class='pl']/text()").extract_first().split('/')[-1]
            item['score'] = book.xpath(".//span[@class='rating_nums']/text()").extract_first()
            item['description'] = book.xpath(".//p[@class='quote']/span/text()").extract_first()
            yield item

            next_link = response.xpath("..//div[@class='paginator']//span[@class='next']/a/@href") # 得到下一页网址的起始数字
            # 查看是否有下一页
            if next_link:
                next_link = next_link.extract_first().split('?')[-1]
                next_page = '?' + next_link
                next_page = response.urljoin(next_page)  # 生成下一页的链接
                yield scrapy.Request(next_page,callback=self.parse) # 访问下一页

4.开始爬虫,并保存到data.json文件

scrapy crawl doubanspider -o data.json

查看获取的数据数量,获取到250条数据。


image.png

查看json文件:


data.json

采集过程中遇到的几个问题:

问题1:使用scrapy shell查看xpath路径是否正确提取到数据时无法连接到目标网站

在命令行输入

scrapy shell "https://book.douban.com/top250"

返回结果:

返回状态码403

可以看到,申请访问豆瓣读书页面的HTTP返回状态码是403,说明豆瓣设置了反爬虫机制,会检查访问者的user-agent信息,因此个人爬虫无法抓取数据。
解决办法
1. 连接时在命令上加上 -s USER_AGENT='Mozilla/5.0',即

scrapy shell -s USER_AGENT='Mozilla/5.0' "https://book.douban.com/top250"

返回状态码200

返回状态码为200,成功访问到页面。这种方法简单但是每次操作时都要加上这段代码比较繁琐。
2. 修改scrapy的user-agent默认值
我的参考:Scrapy shell调试返回403错误 - CSDN博客
首先找到python的:安装目录下的default_settings.py文件,比如我的在D:\Program Files\python\Lib\site-packages\scrapy\settings\default_settings.py

USER_AGENT = 'Scrapy/%s (+http://scrapy.org)' % import_module('scrapy').__version__ 

改为

USER_AGENT = 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0' 
修改默认设置

则再次访问此类网站时,可以正常访问html不会在出现403错误了。这种修改主要是更改自己的user-agent信息,伪装成浏览器进行访问。

问题2:下一页的链接构建正确,但是无法访问下一页的链接从而无法循环采集数据

查阅各种资料后发现我的下面这行代码有误,注释掉即可:

allowed_domains = ['https://www.douban.com/'] # 包含构成许可域的基础URL,供蜘蛛去爬,不在此允许范围内的域名就会被过滤,而不会进行爬取

而我要访问的网页

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

是不在允许域的,因此出现错误。
需要说明的一点:虽然设置了允许域进行过滤,但是不会过滤start_urls的网址,因此首页数据可以获取到,只是无法进行循环抓取。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容