1.scrapy图解
2.创建项目
scrapy startproject 项目名
创建后的目录
3.编写字段
在items.py中编写需要的字段,这里就写小说的章节和内容
class XiaoshuoItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
#章节
page = scrapy.Field()
#内容
content = scrapy.Field()
4.创建爬虫文件
scrapy genspider 文件名 域名
创建成功之后,在spiders中将会出现一个文件
文件里面是这样的
注意:parse方法不能修改名字,不然会报错,用来实现爬取网页
下面是案例:
由于小说每章的内容在下一个页面,我们需要进入下一个页面爬取数据需要重新再定义一个方法。同时,parse方法需要将下一个页面的路径和数据等传递给第二个方法。
class WangyouSpider(scrapy.Spider):
name = 'wangyou'
allowed_domains = ['www.800txt.net']
start_urls = ['https://www.800txt.net/book_112506/']
def parse(self, response):
#节点
node_list = response.xpath("//dl/dd")
for obj in node_list:
#章节
page = obj.xpath('./a/text()')[0].extract()
#二级页面路径
page_href = obj.xpath('./a/@href')[0].extract()
page_href = self.start_urls[0]+page_href
#将page赋值给item中,用来之后的抛出
item = XiaoshuoItem()
item['page'] = page
yield scrapy.Request(url=page_href,callback=self.sec_handler,meta={'item':item})
scrapy.Request的常用参数:
url:下一个页面的路径
callback:指定该请求返回的Response,由那个函数来处理。
meta:比较常用,在不同的请求之间传递数据使用的。字典dict型
第二个方法:用来爬取小说的内容
def sec_handler(self,response):
item = response.meta['item']
#获取内容
content_list = response.xpath('//div[@id="content"]/text()')
#处理,把字符串提取出来,并去掉空格
conecnt = ''
for data in content_list:
conecnt+=data.extract().replace(' ','')
#赋值并抛出item
item['content'] = conecnt
return item
5.启动爬虫
scrapy crawl 爬虫名 -o 文件名.格式
格式有以下几种:
到此为止,就成功了!