通过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