通過scrapy實現翻頁功能,爬取小說網站信息
測試網站:全書網。
根據scrapy這個框架的運行特點,翻頁必須和處理數據分開,不然無法執行。
一開始嘗試只用一個prase函數,直接按照以往的循環思想處理,失敗了,這個也希望其他學友注意這個問題,一定要分開。也就是翻頁功能是一個函數,處理是一個函數,放到兩個函數中去。
先在items文件裏面填寫如下字段,注意,在爬蟲文件裏面處理字段的時候,字段名可不能打錯了。
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class TencentItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
link_url = scrapy.Field()
author_name = scrapy.Field()
接下來就是爬取。
注意,response裏面的url不能直接被使用,所以,如果想要實現翻頁功能,必須手動把基本url拼接出來。但前提是,start_url 必須是能夠訪問的,不能出現404的情況。start_url相當於一個敲門磚。
# -*- coding: utf-8 -*-
import scrapy
from ..items import TencentItem
class TencentSpiderSpider(scrapy.Spider):
name = 'tencent_spider'
# allowed_domains = ['ddd']
start_urls = ['http://www.quanshuwang.com/list/2_1.html']# 這個url必須是能訪問的。
def parse(self, response):
base_url='/'.join(response.url.split('/')[:4])+'/'# 拼接路徑。
for i in range(1,11):
url = base_url+'2_%d.html'%i
yield scrapy.Request(url,callback=self.parse_url)# 交給子函數進行下一步處理。
def parse_url(self, response):
'''
:param response:
:return:
'''
title_list = response.xpath("//section[@class='section board-list board-list-collapse']/ul/li/span/a[1]/@title").extract()
link_url = response.xpath("//section[@class='section board-list board-list-collapse']/ul/li/span/a[3]/@href").extract()
author_name = response.xpath("//section[@class='section board-list board-list-collapse']/ul/li/span/a[2]/text()").extract()
# print(title_list, link_url, author_name)
for title_list,link_url,author_name in zip(title_list,link_url,author_name):
items = TencentItem()
items['title']=title_list
items['link_url']=link_url
items['author_name']=author_name
yield items