国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python爬蟲教程使用Scrapy框架爬取小說代碼示例

Python爬蟲教程使用Scrapy框架爬取小說代碼示例

2022-01-05 00:06霖hero Python

相信學Python爬蟲的小伙伴聽說過Scrapy框架,也用過Scrapy框架,今天我們邊學習Scrapy框架邊爬取整部小說,讓大家在不知不覺的學習過程中使用Scrapy框架完成整部小說的爬取

Scrapy框架簡單介紹

Scrapy框架是一個基于Twisted的異步處理框架,是純Python實現(xiàn)的爬蟲框架,是提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架,其架構(gòu)清晰,模塊之間的耦合程度低,可擴展性極強,我們只需要少量的代碼就能夠快速抓取數(shù)據(jù)。

其框架如下圖所示:

Python爬蟲教程使用Scrapy框架爬取小說代碼示例

Scrapy Engine是整個框架的核心,而涉及到我們編寫代碼的模塊一般只有Item Pipeline模塊和Spiders模塊。

 

創(chuàng)建Scrapy項目

首先我們通過以下代碼來創(chuàng)建Scrapy項目,執(zhí)行代碼如下圖所示:

Scrapy startproject Fiction

運行結(jié)果如下圖所示:

Python爬蟲教程使用Scrapy框架爬取小說代碼示例

通過上圖可知,我們在C盤創(chuàng)建了一個新的Scrapy項目,項目名為Fiction,而且還提示我們可以通過以下命令創(chuàng)建第一個Spider爬蟲,命令如下所示:

cd Fiction          #進入目錄
scrapy genspider example example.com    #創(chuàng)建spider爬蟲

其中example是我們爬蟲名,example.com是爬蟲爬取的范圍,也就是網(wǎng)站的域名。

Fiction文件夾內(nèi)容如下圖所示:

Python爬蟲教程使用Scrapy框架爬取小說代碼示例

 

創(chuàng)建Spider爬蟲

在上面的步驟我們成功創(chuàng)建了一個Scrapy項目,而且知道如何創(chuàng)建Spider爬蟲,接下來我們創(chuàng)建名為fiction的Spider爬蟲,其域名為www.17k.com,代碼如下所示:

scrapy genspider fiction www.17k.com

運行后,spiders文件夾中多了我們剛才創(chuàng)建fiction.py,這個就是我們創(chuàng)建的Spider爬蟲。

如下圖所示:

Python爬蟲教程使用Scrapy框架爬取小說代碼示例

看到這么多py文件是不是慌了,其實不用慌,一般情況我們主要在剛創(chuàng)建的spider爬蟲文件、items.py和pipelines.py進行編寫代碼,其中:

  • fiction.py:主要編寫代碼定義爬取的邏輯,解析響應(yīng)并生成提取結(jié)果和新的請求;
  • items.py:主要先定義好爬取數(shù)據(jù)的字段,避免拼寫錯誤或者定義字段錯誤,當然我們可以不先定義好字段,而在fiction.py中直接定義;
  • pipelines.py:主要是編寫數(shù)據(jù)清洗、驗證和存儲數(shù)據(jù)的代碼,當我們把數(shù)據(jù)存儲在csv、xml、pickle、marshal、json等文件時,就不需要在pipelines.py中編寫代碼了,只需要執(zhí)行以下代碼即可:
scrapy crawl fiction 文件名.后綴

當數(shù)據(jù)需要保存在MongoDB數(shù)據(jù)庫時,則編寫以下代碼即可:

from pymongo import  MongoClient
client=MongoClient()
collection=client["Fiction"]["fiction"]
?class Test1Pipeline:
  def process_item(self, item, spider):
      collection.insert(item)
      return item

 

Spider爬蟲提取數(shù)據(jù)

在提取數(shù)據(jù)前,首先我們進入要爬取小說網(wǎng)站并打開開發(fā)者工具,如下圖所示:

Python爬蟲教程使用Scrapy框架爬取小說代碼示例

Python爬蟲教程使用Scrapy框架爬取小說代碼示例

我們通過上圖可以發(fā)現(xiàn),<dl class="Volume">存放著我們所有小說章節(jié)名,點擊該章節(jié)就可以跳轉(zhuǎn)到對應(yīng)的章節(jié)頁面,所以可以使用Xpath來通過這個div作為我們的xpath爬取范圍,通過for循環(huán)來遍歷獲取每個章節(jié)的名和URL鏈接。

跳轉(zhuǎn)章節(jié)內(nèi)容頁面后,打開開發(fā)者工具,如下圖所示:

Python爬蟲教程使用Scrapy框架爬取小說代碼示例

通過上圖可以發(fā)現(xiàn),小說內(nèi)容存儲在<div class="readAreaBox">里面,我們可以通過for循環(huán)來遍歷該dl中的<div class="p">獲取到章節(jié)的全部內(nèi)容,當然也是通過使用Xpath來獲取。

 

items.py代碼定義字段

細心的小伙伴就發(fā)現(xiàn)了,我們所需要提前的字段有章節(jié)名、章節(jié)URL鏈接和章節(jié)內(nèi)容,其中章節(jié)名和章節(jié)內(nèi)容是需要進行數(shù)據(jù)保存的,所以可以先在items.py文件中定義好字段名,具體代碼如下所示:

import scrapy
?class FictionItem(scrapy.Item):
  # define the fields for your item here like:
  name = scrapy.Field()
  text = scrapy.Field()

定義字段很簡單,字段名=scrapy.Field()即可。

對了,在items.py定義好字段有個最好的好處是當我們在獲取到數(shù)據(jù)的時候,使用不同的item來存放不同的數(shù)據(jù),在把數(shù)據(jù)交給pipeline的時候,可以通過isinstance(item,FictionItem)來判斷數(shù)據(jù)屬于哪個item,進行不同的數(shù)據(jù)(item)處理。

定義好字段后,這是我們通過在pipeline.py文件中編寫代碼,對不同的item數(shù)據(jù)進行區(qū)分,具體代碼如下:

from Fiction.items import FictionItem
class FictionPipeline:
  def process_item(self, item, spider):
      if isinstance(item,FictionItem):
          print(item)

當然,在我們爬取的項目中,只需要一個class類,在上面的代碼只是為了展示如何判斷區(qū)分數(shù)據(jù)屬于哪個item。

 

fiction.py代碼提取數(shù)據(jù)

fiction.py文件也就是我們創(chuàng)建的spider爬蟲,打開fiction.py文件,其代碼內(nèi)容如下所示:

import scrapy
class FictionSpider(scrapy.Spider):
  name = 'fiction'
  allowed_domains = ['www.17k.com']
  start_urls = ['http://www.17k.com/']
?    def parse(self, response):
      pass

其中:

  • name是定義此爬蟲名稱的字符串,每個項目唯一的名字,用來區(qū)分不同的Spider,啟動爬蟲時使用scrapy crawl +該爬蟲名字;
  • allowed_domains是允許爬取的域名,防止爬蟲爬到其他網(wǎng)站;
  • start_urls是最開始爬取的url;
  • parse()方法是負責解析返回響應(yīng)、提取數(shù)據(jù)或進一步生成要處理的請求,注意:不能修改這個方法的名字。

大致了解該文件內(nèi)容的各個部分后,我們開始提取首頁的章節(jié)名和章節(jié)URL鏈接,具體代碼如下所示:

import scrapy
from Fiction.items import FictionItem
?class FictionSpider(scrapy.Spider):
  name = 'fiction'
  allowed_domains = ['www.17k.com']
  start_urls = ['https://www.17k.com/list/2536069.html']
?    def parse(self, response):
      html = response.xpath('//dl[@class="Volume"]')
      books = html.xpath('./dd/a')
      for book in books:
          item =FictionItem()
          item['name'] = []
          name = book.xpath('./span/text()').extract()
          for i in name:
              item['name'].append(i.replace('\n', '').replace('\t', ''))
          href = book.xpath('./@href').extract_first()
          href = 'https://www.17k.com' + href
          yield scrapy.Request(url=href, callback=self.parse_detail, meta={'item': item})

首先導(dǎo)入FictionItem,再我們把start_urls鏈接修改為待會要爬的URL鏈接,在parse()方法中,使用xpath獲取章節(jié)名和章節(jié)URL鏈接,通過for循環(huán)調(diào)用FictionItem(),再把章節(jié)名存放在item里面。

通過生成器yield 返回調(diào)用scrapy.Request()方法,其中:

  • url=href:表示下一個爬取的URL鏈接;
  • callback:表示指定parse_detail函數(shù)作為解析處理;
  • meta:實現(xiàn)在不同的解析函數(shù)中傳遞數(shù)據(jù)。

在上一步中我們指定了parse_detail函數(shù)作為解析處理,接下來將編寫parse_detail函數(shù)來獲取章節(jié)內(nèi)容,具體代碼如下所示:

  def parse_detail(self,response):
      string=""
      item=response.meta['item']
      content=response.xpath('//*[@id="readArea"]/div[1]/div[2]//p/text()').extract()
      for i in content:
          string=string+i+'\n'
      item['text']=string
      yield item

首先我們定義了一個空變量string,在通過response.meta[]來接收item數(shù)據(jù),其參數(shù)為上一步中的meta={'item': item}的item,接下來獲取章節(jié)內(nèi)容,最后將章節(jié)內(nèi)容存儲在item['text']中,并通過生成器yield返回數(shù)據(jù)給引擎。

 

pipelines.py代碼保存數(shù)據(jù)

章節(jié)名和章節(jié)內(nèi)容已經(jīng)全部獲取下來了,接下來我們把獲取下來的數(shù)據(jù)保存為txt文件,具體代碼如下所示:

from Fiction.items import FictionItem
import time
class FictionPipeline:
  def open_spider(self, spider):
      print(time.time())
  def process_item(self, item, spider):
      if isinstance(item, FictionItem):
          content = item['text']
          with open(f'小說/{title[0]}.txt', 'w', encoding='utf-8')as f:
              f.write(content)
  def close_spider(self, spider):
      print(time.time())

首先我們導(dǎo)入FictionItem、time,在open_spider()和close_spider()方法編寫代碼調(diào)用time.time()來獲取爬取的開始時間和結(jié)束時間,再在process_item()方法中,把引擎返回的item['name']和item['text']分別存放在title和content中,并通過open打開txt文件,調(diào)用write()把章節(jié)內(nèi)容寫入在txt文件中。

 

settings.py代碼啟動爬蟲

在啟動爬蟲前,我們先要在settings.py文件中啟動引擎,啟動方式很簡單,只要找到下圖中的代碼,并取消代碼的注釋即可:

Python爬蟲教程使用Scrapy框架爬取小說代碼示例

有人可能問:那User-Agent在哪里設(shè)置?我們可以在settings.py文件中,設(shè)置User-Agent,具體代碼如下:

Python爬蟲教程使用Scrapy框架爬取小說代碼示例

好了,所有代碼已經(jīng)編寫完畢了,接下來將啟動爬蟲了,執(zhí)行代碼如下:

scrapy crawl fiction

啟動爬蟲后,發(fā)現(xiàn)我們控制臺里面多了很多l(xiāng)og日志數(shù)據(jù)的輸出,這時可以通過在settings.py添加以下代碼,就可以屏蔽這些log日志:

LOG_LEVEL="WARNING"

 

結(jié)果展示

Python爬蟲教程使用Scrapy框架爬取小說代碼示例

好了,scrapy框架爬取小說就講到這里了,感覺大家的觀看!!!

更多關(guān)于Python爬蟲教程Scrapy框架爬取的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://blog.csdn.net/weixin_52122271/article/details/120153288

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 午夜精品成人一区二区 | 免费网站在线观看黄 | 久久久九九| 午夜看片 | 久久手机免费视频 | 亚洲午夜视频 | 久久美| 国产成人精品a视频一区www | 欧美日韩成人在线观看 | 欧美欧美欧美 | 一本色道久久综合狠狠躁篇的优点 | 精品久久一二三区 | 涩涩视频观看 | 国产精品区二区三区日本 | 高清一区二区 | 久久久国产一区二区三区四区小说 | 色播一区二区 | 欧美天堂一区二区三区 | 成人激情视频在线观看 | 国产日韩精品视频 | 亚洲 自拍 另类 欧美 丝袜 | 人人做人人澡人人爽欧美 | 99精品视频一区二区三区 | 免费一级特黄做受大片 | 这里只有精品视频 | 99久久久国产精品 | 欧美一区二区视频免费观看 | 国产欧美综合一区二区三区 | 午夜电影 | 日韩一区二区三区在线观看 | av中文字幕免费在线观看 | 亚洲精品视频在线免费播放 | 亚洲毛片在线观看 | 亚洲一区中文字幕在线观看 | 一区二区三区久久久 | 91国产精品 | 久草青青 | 日韩精品免费视频 | 精品视频在线观看 | 日韩电影免费观看 | 亚洲欧美视频网站 |