Python Scrapy(1)-新建scrapy工程,爬取豆瓣读书

Scrapy是经典的爬虫框架;框架,顾名思义,可以让开发者免去“重复造轮子”的枯燥与重复,从而加快爬虫建设进度。

2017年12月19日:安装Scrapy包,建立一个新工程,需要在cmd窗口中输入
scrapy startproject project_name
project_name是工程的名字。之后,你就会发现,该工程已经存在于你所指定的某个文件夹中了。例如,在cmd输出scrapy startproject abcd,那么在cmd运行的当前目录下,就会生成一个命名为abcd的文件夹。即为Scrapy工程文件。

此处,我输入scrapy startproject doubanbook,会生成doubankook这个文件夹;此文件夹下方,有doubankook文件夹,以及scrapy.cfg这个文件,如下图所示(这个book文件是爬取的文件,不算0-0):
这里写图片描述
scrapy.cfg是总的控制文件,一般不用打开更改;但是这个文件也不能删去,否则,scrapy运行不了!!!

进入这个doubanbook文件夹,即下图所示,这几个文件也是执行startproject命令时候,框架自动生成的,每个文件都有有自己作用。spiders文件夹这个目录,用来防止我们自己写的py爬虫文件(这个py需要自己新建,不是自动生成的);init.py是自动生成的,不用理会,也不必修改;items.py用于定义我们想要获取的字段;pipelines.py用于定义我们的存储;settings.py用于设置各种爬取属性;middlewares.py是框架的中间件,不必修改,也不必理会0-0。
这里写图片描述

进入spiders文件夹,则如下图所示。同理,init.py是不用管。这就是Scrapy的基本框架。
这里写图片描述

learning by doing是掌握工程技术最快捷的方式。因此,建立了Scrapy之后,首先不必深入理解那么多原理,去开始爬取数据就行了!

在学习的过程中,遇到的第一个问题就是:网络上针对Scrapy的教程,很多都是Python2环境的,或者是Scrapy1.0以下的版本,这些教程太老旧,在最新的环境下,已经无法运行了。Scrapy官网还在用dmoz.org
这个网站做教程,但是这个网站已经停止运营了=-=真特么无语。

因此,在找实例的过程中,浪费了2天时间!!最后,还是在CSDN上看到了合适的例子。不得不佩服这个社区的更新速度和技术广度~

我参考的教程网址是:http://blog.csdn.net/a1091885194/article/details/78467595。win7+python3.6+Spyder环境下,实测可运行。

下面记录详细的实操步骤:
1、在cmd窗口中输入如下代码,新建scrapy工程
scrapy startproject project_name

2、打开items.py,内部代码如下

# items.py文件的作用是:定义要提取的数据
# Item是保存爬取到的数据的容器,任何定义的Item都要继承scrapy.item;
# 定义Item非常简单,只需要继承scrapy.Item类,并将所有字段都定义为scrapy.Field类型即可
# 在Item中要定义相应的字段,如name/price等需要爬取的信息,Field对象用于为每个字段指定任意元数据

import scrapy

class DoubanbookItem(scrapy.Item): # 继承scrapy.item父类
    # define the fields for your item here like:
    # name = scrapy.Field()
    # pass
    name = scrapy.Field()            # 书名
    price = scrapy.Field()           # 价格
    edition_year = scrapy.Field()    # 出版年份
    publisher = scrapy.Field()       # 出版社  
    ratings = scrapy.Field()         # 评分  
    author = scrapy.Field()          # 作者  
    content = scrapy.Field()         # 内容

3、新建爬虫文件, 命名为BookSpider.py;也可以在cmd中,用scrapy genspider doubanbook douban.com来新建一个spider(这里,doubanbook是爬虫的name,douban.com是爬虫的爬取域)。内部代码如下:

# BookSpider.py的作用是:在单一网站或一群网站,编写爬取数据的类。
# 它包含了:一个用于下载的初始url;跟进网页链接、分析网页的内容;提取生成Item的方法

import scrapy
from doubanbook.items import DoubanbookItem  
  
class BookSpider(scrapy.Spider):
    # 定义spider的三个重要属性:名字name、爬取范围allowed_domains、爬取的第一个页面start_urls。这三个部分是规定、开发者不可更改的
    name = 'doubanbook'  
    allowed_domains = ['douban.com']  
    start_urls = [  
        'https://book.douban.com/top250'  
    ]  
    
    # parse的作用:
    # 1、每个url下载后生成的response类会传递给parse函数;
    # 2、用于解析response数据;
    # 3、提取数据,生成item;
    # 4、生成需要进一步处理的request对象
    def parse(self, response): # 回调函数 
        # 请求第一页。self指类自身  
        yield scrapy.Request(response.url, callback=self.parse_next)#对第一个初始页面爬取内容,使用回调函数执行parse_next  
  
        # 请求其它页  
        for page in response.xpath('//div[@class="paginator"]/a'):  
            link = page.xpath('@href').extract()[0]#获取链接,用xpath解析网页,用extract函数获取数据  
            yield scrapy.Request(link, callback=self.parse_next)#去其他页面执行同样的操作,用yield构造一个生成器 
  
    def parse_next(self, response):  
        for item in response.xpath('//tr[@class="item"]'):  
            book = DoubanbookItem()  
            book['name'] = item.xpath('td[2]/div[1]/a/@title').extract()[0]  
            book['content'] = item.xpath('td[2]/p/text()').extract()[0]  
            book['ratings'] = item.xpath('td[2]/div[2]/span[2]/text()').extract()[0]  
            yield book

理解yield关键词,可以看这两篇文章:
https://www.jianshu.com/p/d09778f4e055;
http://blog.csdn.net/alvine008/article/details/43410079;

理解
4、打开pipelinse.py,代码如下:

# pipelines.py的作用如下:接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。
# 1.清理HTML数据
# 2.验证爬取的数据(检查item包含某些字段)
# 3.查重(并丢弃)
# 4.将爬取结果保存到数据库中

class DoubanbookPipeline(object):
    def process_item(self, item, spider):
        info = item['content'].split(' / ')  # [法] 圣埃克苏佩里 / 马振聘 / 人民文学出版社 / 2003-8 / 22.00元  
        item['name'] = item['name']  
        item['price'] = info[-1]  
        item['edition_year'] = info[-2]  
        item['publisher'] = info[-3]  
        return item 

5、打开settings.py,代码如下:

BOT_NAME = 'doubanbook'

SPIDER_MODULES = ['doubanbook.spiders']
NEWSPIDER_MODULE = 'doubanbook.spiders'

ROBOTSTXT_OBEY = True

# 上面都是框架自动生成的,下面才是开发者自己写的
# 由于豆瓣存在反爬机制,因此需要在settings生成一个user_agent信息
from faker import Factory  
f = Factory.create()  
USER_AGENT = f.user_agent() 

6、在写好了items.pypipelines.py新建爬虫.py、settings.py这四个文件之后,继续在cmd中,输入如下代码:scrapy crawl doubanbook -o book.csv,即可执行这个scrapy项目。o的作用是,导出爬取的数据;然后将其导入到csv格式的文件当中,此格式文件可以用Excel打开。

是的,scarpy是无法在IDE中直接运行的,只能通过这种蛋疼的方式来新建工程、执行。最后,将数据存放在book.csv这个文件当中,而该文件保存在doubanbook这个项目最顶层的文件路径当中。

除此之外,还可以保存到MySQL中,但是这一招我还没学会0-0

这就是我第一个成功运行的Scrapy项目,爬取了豆瓣读书Top List250,保存在csv中。花费了3天才搞定!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值