最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python Scrapy實(shí)戰(zhàn)之古詩文網(wǎng)的爬取

 更新時(shí)間:2022年05月20日 08:49:41   作者:侯小啾  
本文將利用Python中Scrapy框架,實(shí)現(xiàn)爬取古詩文網(wǎng)上的詩詞數(shù)據(jù),具體包括詩詞的標(biāo)題信息。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

需求

通過python,Scrapy框架,爬取古詩文網(wǎng)上的詩詞數(shù)據(jù),具體包括詩詞的標(biāo)題信息,作者,朝代,詩詞內(nèi)容,及譯文。爬取過程需要逐頁爬取,共4頁。第一頁的url為(https://www.gushiwen.cn/default_1.aspx)

1. Scrapy項(xiàng)目創(chuàng)建

首先創(chuàng)建Scrapy項(xiàng)目及爬蟲程序

在目標(biāo)目錄下,創(chuàng)建一個(gè)名為prose的項(xiàng)目:

scrapy startproject prose

進(jìn)入項(xiàng)目目錄下,然后創(chuàng)建一個(gè)名為gs的爬蟲程序,爬取范圍為 gushiwen.cn

cd prose
scrapy genspider gs gushiwen.cn

2. 全局配置 settings.py

對配置文件settings.py做如下編輯:

①選擇不遵守robots協(xié)議

②下載間隙設(shè)置為1

③并添加請求頭,啟用管道

④此外設(shè)置打印等級:LOG_LEVEL=“WARNING”

具體如下:

# Scrapy settings for prose project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     https://docs.scrapy.org/en/latest/topics/settings.html
#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://docs.scrapy.org/en/latest/topics/spider-middleware.html

BOT_NAME = 'prose'

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

LOG_LEVEL = "WARNING"


# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'prose (+http://www.yourdomain.com)'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32

# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 1
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16

# Disable cookies (enabled by default)
#COOKIES_ENABLED = False

# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False

# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
}

# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
#    'prose.middlewares.ProseSpiderMiddleware': 543,
#}

# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
#    'prose.middlewares.ProseDownloaderMiddleware': 543,
#}

# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
#}

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'prose.pipelines.ProsePipeline': 300,
}

# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False

# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = 'httpcache'
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

3. 爬蟲程序.py

首先是進(jìn)行頁面分析,這里不再贅述該過程。

這部分代碼,也即需要編輯的核心部分。

首先是要把初始URL加以修改,修改為要爬取的界面的第一頁,而非古詩文網(wǎng)的首頁。

需求:我們要爬取的內(nèi)容包括:詩詞的標(biāo)題信息,作者,朝代,詩詞內(nèi)容,及譯文。爬取過程需要逐頁爬取。

其中,標(biāo)題信息,作者,朝代,詩詞內(nèi)容,及譯文都存在于同一個(gè)<div>標(biāo)簽中。

為了體現(xiàn)兩種不同的操作方式,

標(biāo)題信息,作者,朝代,詩詞內(nèi)容 四項(xiàng),我們使用一種方法獲取。并在該for循環(huán)中使用到一個(gè)異常處理語句(try…except…)來避免取到空值時(shí)使用索引導(dǎo)致的報(bào)錯(cuò);

對于譯文,我們額外定義一個(gè)parse_detail函數(shù),并在scrapy.Request()中傳入其,來獲取。

關(guān)于翻頁,我們的思路是:遍歷獲取完每一頁需要的數(shù)據(jù)后(即一大輪循環(huán)結(jié)束后),從當(dāng)前頁面上獲取下一頁的鏈接,然后判斷獲取到的鏈接是否為空。如若不為空則表示獲取到了,則再一次使用scrapy.Requests()方法,傳入該鏈接,并再次調(diào)用parse函數(shù)。如果為空,則表明這已經(jīng)是最后一頁了,程序就會在此處結(jié)束。

具體代碼如下:

import scrapy
from prose.items import ProseItem


class GsSpider(scrapy.Spider):
    name = 'gs'
    allowed_domains = ['gushiwen.cn']
    start_urls = ['https://www.gushiwen.cn/default_1.aspx']

    # 解析列表頁面
    def parse(self, response):
        # 一個(gè)class="sons"對應(yīng)的是一首詩
        div_list = response.xpath('//div[@class="left"]/div[@class="sons"]')
        for div in div_list:
            try:
                # 提取詩詞標(biāo)題信息
                title = div.xpath('.//b/text()').get()
                # 提取作者和朝代
                source = div.xpath('.//p[@class="source"]/a/text()').getall()
                # 作者
                # replace
                author = source[0]
                # 朝代
                dynasty = source[1]
                content_list = div.xpath('.//div[@class="contson"]//text()').getall()
                content_plus = ''.join(content_list).strip()
                # 拿到詩詞詳情頁面的url
                detail_url = div.xpath('.//p/a/@href').get()
                item = ProseItem(title=title, author=author, dynasty=dynasty, content_plus=content_plus, detail_url=detail_url)
                # print(item)
                yield scrapy.Request(
                    url=detail_url,
                    callback=self.parse_detail,
                    meta={'prose_item': item}
                )
            except:
                pass

        next_url = response.xpath('//a[@id="amore"]/@href').get()
        if next_url:
            print(next_url)
            yield scrapy.Request(
                url=next_url,
                callback=self.parse
            )


    # 用于解析詳情頁面
    def parse_detail(self, response):
        item = response.meta.get('prose_item')
        translation = response.xpath('//div[@class="sons"]/div[@class="contyishang"]/p//text()').getall()
        item['translation'] = ''.join(translation).strip()
        # print(item)
        yield item
        pass

4. 數(shù)據(jù)結(jié)構(gòu) items.py

在這里定義了ProseItem類,以便在上邊的爬蟲程序中調(diào)用。(此外要注意的是,爬蟲程序中導(dǎo)入了該模塊,有必要時(shí)需要將合適的文件夾標(biāo)記為根目錄。)

import scrapy


class ProseItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 標(biāo)題
    title = scrapy.Field()
    # 作者
    author = scrapy.Field()
    # 朝代
    dynasty = scrapy.Field()
    # 詩詞內(nèi)容
    content_plus = scrapy.Field()
    # 詳情頁面的url
    detail_url = scrapy.Field()
    # 譯文
    translation = scrapy.Field()
    pass

5. 管道 pipelines.py

管道,在這里編輯數(shù)據(jù)存儲的過程。

from itemadapter import ItemAdapter
import json


class ProsePipeline:
    def __init__(self):
        self.f = open('gs.txt', 'w', encoding='utf-8')

    def process_item(self, item, spider):
    	# 將item先轉(zhuǎn)化為字典, 再轉(zhuǎn)化為 json類型的字符串
        item_json = json.dumps(dict(item), ensure_ascii=False)
        self.f.write(item_json + '\n')
        return item

    def close_spider(self, spider):
        self.f.close()

6. 程序執(zhí)行 start.py

定義一個(gè)執(zhí)行命令的程序。

from scrapy import cmdline

cmdline.execute('scrapy crawl gs'.split())

程序執(zhí)行效果如下:

我們需要的數(shù)據(jù),被保存在了一個(gè)名為gs.txt的文本文件中了。

以上就是Python Scrapy實(shí)戰(zhàn)之古詩文網(wǎng)的爬取的詳細(xì)內(nèi)容,更多關(guān)于Python Scrapy爬取古詩文網(wǎng)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python實(shí)現(xiàn)圖片彩色轉(zhuǎn)化為素描

    python實(shí)現(xiàn)圖片彩色轉(zhuǎn)化為素描

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖片彩色轉(zhuǎn)化為素描,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • python如何設(shè)置靜態(tài)變量

    python如何設(shè)置靜態(tài)變量

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于python如何設(shè)置靜態(tài)變量的相關(guān)文章,有興趣的朋友們可以參考下。
    2020-09-09
  • 基于PyQt5制作一個(gè)windows通知管理器

    基于PyQt5制作一個(gè)windows通知管理器

    python框架win10toast可以用來做windows的消息通知功能,通過設(shè)定通知的間隔時(shí)間來實(shí)現(xiàn)一些事件通知的功能。本文將利用win10toast這一框架制作一個(gè)windows通知管理器,感興趣的可以參考一下
    2022-02-02
  • 利用python批量給云主機(jī)配置安全組的方法教程

    利用python批量給云主機(jī)配置安全組的方法教程

    這篇文章主要給大家介紹了利用python批量給云主機(jī)配置安全組的方法教程,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • python實(shí)現(xiàn)給scatter設(shè)置顏色漸變條colorbar的方法

    python實(shí)現(xiàn)給scatter設(shè)置顏色漸變條colorbar的方法

    今天小編就為大家分享一篇python實(shí)現(xiàn)給scatter設(shè)置顏色漸變條colorbar的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python處理缺失數(shù)據(jù)的多種方式

    Python處理缺失數(shù)據(jù)的多種方式

    在數(shù)據(jù)分析和數(shù)據(jù)處理的過程中,缺失數(shù)據(jù)(Missing Data)是一個(gè)常見的問題,缺失數(shù)據(jù)的存在可能會影響模型的準(zhǔn)確性和預(yù)測的可靠性,因此正確處理缺失數(shù)據(jù)是數(shù)據(jù)分析的重要步驟,所以本文給大家介紹了Python處理缺失數(shù)據(jù)的多種方式,需要的朋友可以參考下
    2024-08-08
  • 一篇文章快速理解python中的yield關(guān)鍵字

    一篇文章快速理解python中的yield關(guān)鍵字

    Python中的yield關(guān)鍵字可以讓函數(shù)變成生成器,產(chǎn)生一個(gè)值后暫停,下次調(diào)用時(shí)從上次停下的地方繼續(xù)執(zhí)行,從而節(jié)省內(nèi)存并提高效率,這篇文章主要介紹了python中yield關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下
    2024-11-11
  • Python語言描述連續(xù)子數(shù)組的最大和

    Python語言描述連續(xù)子數(shù)組的最大和

    這篇文章主要介紹了Python語言描述連續(xù)子數(shù)組的最大和,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python如何定義接口和抽象類

    Python如何定義接口和抽象類

    這篇文章主要介紹了Python如何定義接口和抽象類,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 基于Python組裝jmx并調(diào)用JMeter實(shí)現(xiàn)壓力測試

    基于Python組裝jmx并調(diào)用JMeter實(shí)現(xiàn)壓力測試

    這篇文章主要介紹了基于Python組裝jmx并調(diào)用JMeter實(shí)現(xiàn)壓力測試,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評論

齐齐哈尔市| 庐江县| 布拖县| 东宁县| 齐齐哈尔市| 九龙坡区| 德江县| 齐河县| 克什克腾旗| 彰化县| 潍坊市| 黑水县| 宿州市| 三穗县| 海晏县| 敦化市| 五华县| 徐闻县| 通海县| 河曲县| 花垣县| 天长市| 上蔡县| 阜南县| 沛县| 阿拉善右旗| 兰西县| 平阴县| 江西省| 临夏县| 平安县| 宁乡县| 金坛市| 军事| 香格里拉县| 扎囊县| 富阳市| 长阳| 汝阳县| 娱乐| 青州市|