本次爬蟲用來爬取http://www.xbiquge.la中的小說json
scrapy startproject biquge(項目名) 建立一個爬蟲項目併發
目錄結構:dom
./biquge/scrapy
|____ scrapy.cfg 用以記錄當前項目的基礎設置,settings的位置,,調度,項目名等ide
|____ biquge函數
|____ __init__.py 必須有網站
|____ items.py 寫存儲字段url
|____ middlewares.py spa
|____ pipelines.py 管道文件.net
|____ settings.py 爬蟲設置文件
|____ spiders
|____ __init__.py
Scrapy中啓用IP:https://blog.csdn.net/qq_34798152/article/details/79944682
./biquge/biquge/settings.py字段:
BOT_NMAE:爬蟲名
SPIDER_MOUDLES(NEWSPIDER_MOUDLE):爬蟲位置
ROBOTSTXT_OBEY:是否遵循網站的robots.txt協議
DOWNLOAD_DELAY:爬蟲延時
CONCURRENT_REQUESTS:爬蟲併發量(默認爲16)
CONCURRENT_REQUESTS_PER_DOMAIN:若是目標域名較少,會提供併發請求數目的進一步限制
CONCURRENT_REQUESTS_PER_IP:若是設置了本屬性,CURRENT_REQUESTS_PER_DOMAIN會被忽略,這時的限制會是針對IP的。
可把CONCURRENT_REQUESTS_PER_IP保持爲默認值(0),金庸對每一個IP的限制,再將CONCURRENT_REQUESTS+PER_DOMAIN設置爲一個很大的值(10000)。這樣設置實際上就僅用了這些限制,這樣下載器的併發請求數目就只有CONCURRENT_REQUESTS來控制。
COOKIES_ENABLED:是否啓用Cookie
TELNETCONSOLE_ENABLED:是否禁用Telent控制檯
DEFAULT_REQUEST_HEADERS:默認請求標頭
SPIDER_MIDDLEWARES:spider中間件設置
DOWNLOADER_MIDDLEWARES:下載器中間件設置
EXTENSIONS:擴展程序設置
ITEM_PIPELINES:項目管道設置
AUTOTHROTTLE_ENABLED:AutoThrottle擴展
AUTOTHROTTLE_START_DELAY:初始下載延遲
AUTOTHROTTLE_MAX_DELAY:高延遲狀況下設置的最大延遲
更詳細字段:https://blog.csdn.net/u011781521/article/details/70188171
在./biquge/biquge/items.py中寫須要爬取的字段結構(這裏只演示獲取title與對應URL):
1 import scrapy 2 3 class UrlItem(scrapy.Item): 4 title = scrapy.Field() 5 url = scrapy.Field()
./biquge目錄下,scrapy genspider Scrn "www.xbiquge.la" 建立一個名爲"Scrn"的爬蟲,指定爬取範圍爲www.xbiquge.la
./biquge/biquge/spiders
|____ __init__.py
|____ Scrn.py 寫爬蟲邏輯的主要文件
./biquge/biquge/spiders/Scrn.py中字段:
1 import scrapy 2 from biquge.items import UrlItem #引入存儲字段結構的Item類 3 4 class ScrnSpider(scrapy.Spider): 5 name = 'Scrn' #爬蟲名,再命令行用scrapy crawl 爬蟲名來執行爬蟲 6 allowed_domains = ['http://www.xbiquge.la'] #爬蟲的活動域 7 start_urls = ['http://www.xbiquge.la/10/10489/'] #爬蟲的起始網址,通常爲想要爬取的網頁地址 8 9 def parse(self,response): #默認的爬蟲解析函數 10 for each in response.xpath("//div[@id='list']/dl/dd"): #使用xpath解析獲取須要的字段 11 item = UrlItem() 12 item['title'] = each.xpath("./a/text()").extract_first() #將解析的字段存入item 13 item['url'] = each.xpath("./a/@href").extract_first() 14 15 yield item #將item拋出給管道文件處理(Pipelines.py),須要在settings文件中設置
在./biquge/biquge/pipelines.py中編寫處理item的邏輯:
1 import json 2 3 class UrlPipeline(object): 4 def __init__(self): 5 self.filename = open("Url.json","wb") #在初始化函數中打開存儲數據的文件 6 def process_item(self, item, spider): #用於接收並處理item的方法 7 jsontext = json.dumps(dict(item),ensure_ascii=False)+"\n" #將傳入的item用字典加載,再轉爲json,ensure_ascii=False用於輸出中文 8 self.filename.write(jsontext.encode("utf-8")) #將轉爲json的字段寫入文件 9 return item 10 def close_spider(self,spider): #關閉爬蟲時執行 11 self.filename.close() #關閉文件
在./biquge/biquge/settings.py中啓用管道文件:
1 ITEM_PIPELINES = { 2 'biquge.pipelines.UrlPipeline': 300, 3 }
整體來說:
./biquge/biquge/items.py文件中定義字段結構
./biquge/biquge/pipelines.py文件中編寫存儲邏輯
./biquge/biquge/spiders/Scrn.py文件中編寫爬取邏輯,並存儲到item中,再拋出(from biquge.items import UrlItem)
./biquge/biquge/settings.py文件中設置Scrn.py與pipelines.py文件的鏈接(item)