Scrapy爬取多層級網頁內容的方式


# -*- coding: utf-8 -*-
import scrapy
from Avv.items import AvvItem

class AvSpider(scrapy.Spider):
    name = 'av' # 爬蟲名
    allowed_domains = ['51porn.net/'] # 爬蟲作用域

    # 爬取第2頁到最后一頁的代碼
    url = 'http://www.51porn.net/nvyoudaquan/index_{}.html' # 起始url,並用花括號格式化
    offset = 2 # 偏移量
    start_urls = [url.format(str(offset))] # 拼接為完整url
    
    
    def parse(self, response): # 第一個parse,從中提取下一層url
     # 第一部分
        links = response.xpath("//ul[@class='clearfix']/li/a/@href").extract() # 利用xpath提取下一層的url列表,並用extract轉換為字符串
        for link in links: # 遍歷上個列表
            url = "http://www.51porn.net" + link # 由於提取出來的url不完整,所以需要拼接為完整的url
            yield scrapy.Request(url,callback=self.parse_s,dont_filter=True) # 請求下一層url,方法為第二個parse,dont_filter=True的作用是避免有時候新的url會被作用域過濾掉


    # 第二部分 m_page = 26 # 這里設置的是第一層的url有多少頁 if self.offset<m_page: # 如果當前頁小於最大頁 self.offset += 1 # 偏移量自增1 yield scrapy.Request(self.url.format(str(self.offset)),callback=self.parse,dont_filter=True) # 再此請求第一層的新的url def parse_s(self, response): link = response.xpath("//div[@class='wrap loadimg avlist-small']/ul/li[1]/a/@href").extract()[0] # 提取第2層url url = "http://www.51porn.net" + link # 拼接為新的url yield scrapy.Request(url,callback=self.parse_t,dont_filter=True) # 請求第3個parse def parse_t(self, response): links = response.xpath("//ul[@class='alllist clearfix']/li/a/@href").extract() # 提取第3層url for link in links: url = "http://www.51porn.net" + link # 拼接為新的url yield scrapy.Request(url,callback=self.parse_last,dont_filter=True) # 請求最后的parse def parse_last(self, response): item = AvvItem() # 實例一個引入的字典類對象 node_list = response.xpath("//div[@class='content loadimg wow fadeInUp']") for node in node_list: # 提取以下具體信息 item["m_num"] = node.xpath("./p[1]/text()").extract()[0] item["m_name"] = node.xpath("./p[2]/text()").extract()[0] item["s_name"] = node.xpath("./p[3]/a/text()").extract()[0] item["i_date"] = node.xpath("./p[4]/text()").extract()[0] item["l_work"] = node.xpath("./p[5]/text()").extract()[0] item["m_style"] = node.xpath("./p[7]/text()").extract()[0] if len(node.xpath("./p[7]/text()"))>0 else "" # 判斷此信息是否為空值 item["c_work"] = node.xpath("./p[8]/img/@src").extract()[0] yield item # 返回


免責聲明!

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



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