在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ scrapy 獲取下一頁失敗

scrapy 獲取下一頁失敗

爬取豆瓣讀書,只能獲得第一頁的信息。

spider類代碼如下:

# -*- coding: utf-8 -*-
import scrapy
from doubanbook.items import DoubanbookItem

class KgbookSpider(scrapy.Spider):
    #這個spider類的唯一標(biāo)識
    name = 'KGbook'
    #爬取的網(wǎng)頁在這個域名下,非此域名被忽略
    allowed_domains = ['book.douban.com/tag/考古']
    #spider啟動時下載的網(wǎng)址
    start_urls = ['https://book.douban.com/tag/考古']

    #解析網(wǎng)頁,獲得item
    def parse(self, response):
        #用來存儲item
        #items = []
        #將包含每本書的<li>標(biāo)簽,作為單個元素依次裝入列表booklist中
        booklist = response.xpath('//*[@id="subject_list"]/ul/li')
        #依次遍歷列表中每個元素,即依次遍歷每個包含一本書信息的<li>標(biāo)簽
        for r in booklist:
            #創(chuàng)建DoubanbookItem()對象
            item = DoubanbookItem()
            #書名
            item['title'] = r.xpath('./div[2]/h2/a/@title').extract_first().replace(' ', '')
            #作者,譯者,出版等信息
            item['author'] = r.xpath('string(./div[2]/div[1])').extract_first().replace('\n', '').replace(' ', '')
            #評分
            item['score'] = r.xpath('string(./div[2]/div[2]/span[2])').extract_first()
            item['peoples'] = r.xpath('string(./div[2]/div[2]/span[3])').extract_first().replace('\n', '').replace(' ', '')
            item['summary'] = r.xpath('string(./div[2]/p)').extract_first().strip()
            yield item

        next_page = response.xpath('//*[@id="subject_list"]/div[2]/span[5]/a/@href').extract_first()#.replace('\n', '').replace(' ', '')
        #print(str(next_page))
        #next_page = ''.join(next_page)
        if next_page is not None:
            next_page_url = response.urljoin(next_page)
            yield scrapy.Request(next_page_url, callback=self.parse, dont_filter=False)

        return item

這是下一頁的標(biāo)簽
圖片描述

有知道錯誤在哪里的前輩請指出,感謝!

回答
編輯回答
慢半拍

已解決!步驟如下:

1.注釋掉allowed_domains = ['book.douban.com/tag/考古']
或者改為allowed_domains = ['book.douban.com']

2.去掉dont_filter=False

3.不同頁的翻頁標(biāo)簽的路徑會有變動,需要用絕對路徑直接定位到這個翻頁的標(biāo)簽或者它的父標(biāo)簽。

解決后代碼如下:

        next_page = response.xpath('//span[@class="next"]/a[contains(text(), "后頁")]/@href').extract()
        if next_page:
            next_page = next_page[0]
            next_page_url = response.urljoin(next_page)
            yield Request(next_page_url, callback=self.parse)
        else:
            print(str(next_page))
2017年10月16日 08:54
編輯回答
萌吟
import scrapy
from First.items import FirstItem


class SpiderMan(scrapy.Spider):
    name = "rose"
    start_urls = [
        "https://wenku.baidu.com/"
    ]

    def parse(self , response):
        for item in response.xpath("http://div/dl/dd/a"):
            title = item.xpath("text()").extract()
            targetUrl = item.xpath("@href").extract_first()
            oneItem = FirstItem()
            oneItem["title"] = title
            oneItem["targetUrl"] = targetUrl
            yield scrapy.Request(url = targetUrl  , meta = {"title":title} , callback=self.parse_url)

    def parse_url(self , response):
        title = response.meta["title"]
        print(title)
        for sel2 in response.xpath('//a[@class="Author logSend"]'):
            docName = sel2.xpath("text()").extract()

            oneItem = FirstItem()
            oneItem["docName"] = docName
            print(oneItem["docName"])

你可以試試我這個方法來請求下一頁,我的代碼是之前寫的有一點(diǎn)BUG ,但是可以看一下思想~

2018年7月8日 20:37