讲起来我跟笔趣看真有不解之缘,之前刚学习python时就是用笔趣看作为试验网站,现在刚接触scrapy框架也是用它来练手。
今天说的是用scrapy爬取一步小说
假设你已经安装了scrapy!
第一步:创建一个scrapy’项目
在命令行输入
scrapy startproject biqukanproject第二步:在项目内创建一个爬虫
这样就创建了一个scrapy项目
在项目命令行处输入
scrapy genspider biqukanspider biqukan.com经过以上的两步我们已经创建了一个爬虫项目,就可以编写爬虫了
解释一下这行命令的参数:
一、biqukanspider 这个参数是创建的这个爬虫的名称(后面爬虫的调用就是用这个名称)
二、biqukan.com 这是该爬虫允许爬取的域名(也就是说爬虫只能在这个域名范围内进行爬取)
接下来编写爬虫:
在刚创建的spider里面编写爬虫
由于我们要抓取的是一个完整的小说,那么就要先抓取每个章节的链接,然后在通过链接抓取小说的内容
抓取的链接的页面:
文章图片
在这个页面抓取了链接以后,利用这个链接抓取详情页的内容:
文章图片
那么明显我们就需要两个方法,分别提取两个链接和内容,并将两个方法关系起来就可以了
接下来就直接贴上这个代码,都有注释,很简单可以看懂:
文件 biqukanspider.py 的代码
# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
from biqukanproject.items import BiqukanprojectItemclass BiqukanspiderSpider(scrapy.Spider):
name = 'biqukanspider' # 爬虫的名称
allowed_domains = ['biqukan.com'] # 允许的域名
start_urls = ['http://biqukan.com/0_790/']
# 开始爬取的链接
def parse(self, response):
# 链接爬取的方法
selector = Selector(response)
# 创建一个选择器的实例
listmain = selector.xpath('.//div[@class="listmain"]/dl/dd')[60:64]for dd in listmain:
title_novel = selector.xpath('.//h2/text()').extract_first()
item = BiqukanprojectItem(title_novel=title_novel)
partial_url = dd.xpath('.//a/@href').extract_first()
url = response.urljoin(partial_url)
title_chapter = dd.xpath('.//a/text()').extract_first()
item['url'] = url
item['title_chapter'] =title_chapter
request = scrapy.Request(url=url,callback=self.parse_body)# 从这里可以看出,scrapy.Request返回值是它回调函数的返回值# Request中有一个参数是meta
# 作用是将一个信息(任意的类型)传递给callback回调函数
# 当然传递使用字典的形式进行的,
# meta={'key':item}(下面的request.meta【‘item’】可以这么写)# 这里为了将详情页的内容和主页的内容一起存储,用了meta方法对,主页的内容
# 进行了一个暂存,在后面进行统一的提交
request.meta['item'] = item # 将item暂存一下
yield requestdef parse_body(self,response):
# 爬取详情页的方法
item = response.meta['item']
# 这是在回调函数中调用刚传进来的信息
# 当然用的是字典的形式调用信息的呀
# 这是回调函数中有一个response的meta属性可以调用传过来的信息
content_list = response.xpath('.//div[@id="content"]/text()').extract()
content = '\n\n'.join(content_list)
# 提取详情页的内容
item['content'] = content
yield item
# yield是将这个函数包装成一个迭代器,每次调用都返回这个item
以上基本上就是程序的主体,接下来还有其它几个文件
setting.py
用于爬虫工程的相关参数的设置
ITEM_PIPELINES = {
'biqukanproject.pipelines.BiqukanprojectPipeline': 300,
}
这个参数用于激活pipelineUSER_AGENT = 'Mozilla/5.0 (Windows NT 6.1;
WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
用于设置请求头
settings.py里面还有一些别的参数,自己看看,需要激活的就只有这两个,在这个爬虫里面
items.py
定义需要抓取的数据的一个文件
import scrapyclass BiqukanprojectItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
url = scrapy.Field()
title_novel = scrapy.Field()
title_chapter = scrapy.Field()
content = scrapy.Field()
# 上面定义了四个抓取的数据
pipeline.py
用于存放处理数据功能的文件,该文件中定义了一些方法用于处理item中的数据
class BiqukanprojectPipeline(object):
def __init__(self):
self.file = open('novel.json',"wb")
def process_item(self, item, spider):
self.file.write(bytes(str(item),encoding='utf-8'))
return item
# 这里是将item数据写入一个novel.json文件中
【初探scrapy(用scrapy爬取一部小说)】以上就是全部内容,我会更新哦,关注一个吧!