Python笔记 之 用Scrapy库编写简单spider

Scrapy简介

Scrapy是快速的高级Web爬网和Web爬网框架,可用于各种有用的应用,例如数据挖掘,信息处理或自动化测试等广泛用途。
Scrapy最初是为Web抓取而设计的,它也可以用于使用API​​或用作通用Web搜寻器来提取数据。
详情请参考官方文档Scrapy 2.4文档
源代码下载

支持的Python版本

Scrapy需要使用Python 3.6+,或者CPython或PyPy 7.2.0+
要使用安装Scrapy conda,请运行:

conda install -c conda-forge scrapy

可以使用pip从PyPI安装Scrapy及其依赖项:

pip install Scrapy

建立项目

在开始抓取之前,必须建设一个新的Scrapy项目
输入要存储代码并运行的目录:

D:
cd mySpiders
#scrapy startproject 项目名称
scrapy startproject spiderQiubai

这将创建一个spiderQiuba,目录机构如下:

spiderQiubai/
    scrapy.cfg            # deploy configuration file
    spiderQiubai/             # project's Python module, you'll import your code from here
        __init__.py
        items.py          # project items definition file
        middlewares.py    # project middlewares file
        pipelines.py      # project pipelines file
        settings.py       # project settings file
        spiders/          # a directory where you'll later put your spiders
            __init__.py

新建第一只蜘蛛

#cd project_name(进入项目目录)
#scrapy genspider 应用名称 爬取网页的起始url
cd spiderQiubai
scrapy genspider qiubai https://www.qiushibaike.com

执行完毕后,会在项目的spiders中生成一个应用名的py爬虫文件,文件源码如下:

# -*- coding: utf-8 -*-
import scrapy

class QiubaiSpider(scrapy.Spider):
    #应用名称
    name = 'qiubai'
    #允许爬取的域名(如果遇到非该域名的url则爬取不到数据)
    allowed_domains = ['www.qiushibaike.com']
    #起始爬取的url
    start_urls = ['https://www.qiushibaike.com']

    def parse(self, response):
    	pass

设置修改settings.py配置文件相关配置:
添加或修改信息如下

#USER_AGENT = 'spiderQiubai (+http://www.yourdomain.com)'
#伪装请求载体身份
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'

#开启管道
ITEM_PIPELINES = {
    #300表示为优先级,值越小优先级越高
    'spiderQiubai.pipelines.SpiderqiubaiPipeline': 300, 
}

#是否遵守robots协议
ROBOTSTXT_OBEY = False

# Disable cookies (enabled by default)
COOKIES_ENABLED = False

设置修改item.py配置文件相关配置:
添加或修改信息如下

class SpiderqiubaiItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    
    #存储作者
    author = scrapy.Field()
    #存储段子内容
    content = scrapy.Field()

设置修改pipelines.py配置文件相关配置:
添加或修改信息如下

class SpiderqiubaiPipeline:
    #构造方法
    def __init__(self):
        #定义一个文件描述符属性
        self.fp = None
    #下列都是在重写父类的方法:
    #开始爬虫时,执行一次
    def open_spider(self,spider):
        print('爬虫开始')
        self.fp = open('./data.txt', 'w',encoding='utf-8')

    #因为该方法会被执行调用多次,所以文件的开启和关闭操作写在了另外两个只会各自执行一次的方法中。
    def process_item(self, item, spider):
        #将爬虫程序提交的item进行持久化存储
        self.fp.write(item['author'] + ':' + item['content'] + '\n')
        return item

    #结束爬虫时,执行一次
    def close_spider(self,spider):
        self.fp.close()
        print('爬虫结束')

设置修改qiubai.py配置文件相关配置:
添加或修改信息如下

# -*- coding: utf-8 -*-
import scrapy
from spiderQiubai.items import SpiderqiubaiItem

class QiubaiSpider(scrapy.Spider):
    #应用名称
    name = 'qiubai'
    #允许爬取的域名(如果遇到非该域名的url则爬取不到数据)
    allowed_domains = ['www.qiushibaike.com']
    #起始爬取的url
    start_urls = ['https://www.qiushibaike.com/text/']

    
    #爬取多页
    pageNum = 1 #起始页码
    url = 'https://www.qiushibaike.com/text/page/%s/' #每页的url

    #访问起始URL并获取结果后的回调函数
    #该函数的response参数就是向起始的url发送请求后
    #获取的响应对象.该函数返回值必须为可迭代对象或者NUll
    def parse(self, response):
        #xpath为response中的方法,可以将xpath表达式直接作用于该函数中
        odiv = response.xpath('//*[@class="article block untagged mb15 typs_hot"]')
        '''print(odiv)
        ss=input('等待输入...')
        if ss not in ('Y','y'):exit()'''
        for div in odiv:
            #xpath函数返回的为列表
            #列表中存放的数据为Selector类型的数据
            #解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出。
            author = div.xpath('.//div[@class="author clearfix"]/a[2]/h2/text()')[0].extract()
            #过滤空行
            author = author.strip('\n')
            content=div.xpath('.//div[@class="content"]/span').xpath('string(.)')[0].extract()
            '''print(content)
            ss=input('等待输入...')
            if ss not in ('Y','y'):exit()'''
            #过滤空行
            content = content.strip('\n')

            #将解析到的数据封装至items对象中
            item = SpiderqiubaiItem()
            item['author'] = author
            item['content'] = content

            #提交item到管道文件(pipelines.py)
            yield item

            #爬取指定页数页码数据
            #超过13页需要用户验证,这里只读取前13页数据
            if self.pageNum <= 13:
                self.pageNum += 1
                url = format(self.url % self.pageNum)
                print(url)

                #递归爬取数据:callback参数的值为回调函数(将url请求后,得到的相应数据继续进行parse解析),递归调用parse函数
                yield scrapy.Request(url=url,callback=self.parse)

运行我们的蜘蛛
请转到项目的顶级目录并运行:

cd ..
scrapy crawl qiubai
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值