這里介紹爬取下一頁
爬取的內容為:
<div class="quote post"> <span class="text"> 各種時代,各國詩人,個抓個的癢。scrapy中文網(http://www.scrapyd.cn)整理 </span> <span> 作者:<small class="author">木心</small> <a href="http://lab.scrapyd.cn/archives/29.html">【詳情】</a> </span> <p></p> <div class="tags"> 標簽 : <a href="http://lab.scrapyd.cn/tag/木心/">木心</a> , <a href="http://lab.scrapyd.cn/tag/藝術/">藝術</a> </div> </div>
網頁源碼中下一頁的鏈接如下:
<li class="next"> <a href="http://lab.scrapyd.cn/page/2/">下一頁 »</a> </li>
爬取多頁的源碼:
# -*- coding: utf-8 -*- import scrapy, base64 proxy_user_pass = b"username:password" encoded_user_pass = base64.b64encode(proxy_user_pass) headers = { 'Proxy-Authorization': b'Basic ' + encoded_user_pass } metas = {'proxy': 'http://openproxy.xxxxxx.com:8080'} class muhe(scrapy.Spider): name = "mutian" #allowed_domains = ["lab.scrapyd.cn"] def start_requests(self): url = 'http://lab.scrapyd.cn/' yield scrapy.Request(url, self.parse, headers = headers, meta = metas) def parse(self, response): sblj = response.css('div.quote') # 提取首頁所有名言,保存至變量mingyan for v in sblj: # 循環獲取每一條名言里面的:名言內容、作者、標簽 text = v.css('.text::text').extract_first() # 提取名言 autor = v.css('.author::text').extract_first() # 提取作者 tags = v.css('.tags .tag::text').extract() # 提取標簽 tags = ','.join(tags) # 數組轉換為字符串: #接下來進行寫文件操作,每個名人的名言儲存在一個txt文檔里面 fileName = '%s-語錄.txt' % autor # 定義文件名,如:木心-語錄.txt with open(fileName, "a+") as f: # 不同人的名言保存在不同的txt文檔,“a+”以追加的形式 f.write(text) f.write('\n') # ‘\n’ 表示換行 f.write('標簽:' + tags) f.write('\n-------\n') f.close() # 接下來我們需要判斷下一頁是否存在,如果存在 # 我們需要繼續提交給parse執行關鍵看 scrapy 如何實現鏈接提交 next_page = response.css('li.next a::attr(href)').extract_first() # css選擇器提取下一頁鏈接 if next_page is not None: # 判斷是否存在下一頁 #如果是相對路徑,如:/page/1 urljoin能替我們轉換為絕對路徑,也就是加上我們的域名 #最終next_page為:http://lab.scrapyd.cn/page/2/ next_page = response.urljoin(next_page) """ scrapy給我們提供了這么一個方法:scrapy.Request() 我們要把鏈接提交給哪一個函數(callback=self.parse)爬取,這里是parse函數,也就是本函數 當然,我們也可以在下面另寫一個函數,比如:內容頁,專門處理內容頁的數據 經過這么一個函數,下一頁鏈接又提交給了parse,那就可以不斷的爬取了,直到不存在下一頁 """ yield scrapy.Request(next_page, callback=self.parse, headers = headers, meta = metas)
參考網址:http://www.scrapyd.cn/doc/160.html
scrapy arguments:指定蜘蛛參數爬取
# -*- coding: utf-8 -*- import scrapy class ArgsspiderSpider(scrapy.Spider): name = "argsSpider" def start_requests(self): url = 'http://lab.scrapyd.cn/' tag = getattr(self, 'tag', None) # 獲取tag值,也就是爬取時傳過來的參數 if tag is not None: # 判斷是否存在tag,若存在,重新構造url url = url + 'tag/' + tag # 構造url若tag=愛情,url= "http://lab.scrapyd.cn/tag/愛情" yield scrapy.Request(url, self.parse) # 發送請求爬取參數內容 def parse(self, response): mingyan = response.css('div.quote') for v in mingyan: text = v.css('.text::text').extract_first() tags = v.css('.tags .tag::text').extract() tags = ','.join(tags) fileName = '%s-語錄.txt' % tags with open(fileName, "a+") as f: f.write(text) f.write('\n') f.write('標簽:' + tags) f.write('\n-------\n') f.close() next_page = response.css('li.next a::attr(href)').extract_first() if next_page is not None: next_page = response.urljoin(next_page) yield scrapy.Request(next_page, callback=self.parse)
比如我們要爬取標簽:愛情,我們可以這樣:
scrapy crawl argsSpider -a tag=愛情
要爬取標簽:勵志,我們可以這樣:
scrapy crawl argsSpider -a tag=勵志
參考網址: http://www.scrapyd.cn/doc/165.html