scrapy 爬取多頁和參數


這里介紹爬取下一頁

 

爬取的內容為:

<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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM