初探scrapy(用scrapy爬取一部小说)

讲起来我跟笔趣看真有不解之缘,之前刚学习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 BiqukanprojectItem


class 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 request

    def 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,
}
这个参数用于激活pipeline

USER_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 scrapy


class 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文件中

以上就是全部内容,我会更新哦,关注一个吧!

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,以下是一个简单的使用Scrapy爬取豆瓣电影的脚本: 首先,创建一个Scrapy项目: ``` scrapy startproject douban_movie ``` 然后,在项目的根目录下创建一个名为douban_movie_spider.py的爬虫文件。在该文件中,编写如下代码: ```python import scrapy class DoubanMovieSpider(scrapy.Spider): name = 'douban_movie' allowed_domains = ['movie.douban.com'] start_urls = ['https://movie.douban.com/top250'] def parse(self, response): for movie in response.xpath('//div[@class="hd"]'): yield {'title': movie.xpath('a/span[@class="title"]/text()').extract_first()} next_page = response.xpath('//span[@class="next"]/a/@href').extract_first() if next_page: yield scrapy.Request(response.urljoin(next_page), callback=self.parse) ``` 在这个爬虫中,我们首先定义了一个名为DoubanMovieSpider的类,它继承自Scrapy的Spider类。我们设置了一些属性,包括name(爬虫的名称)、allowed_domains(允许爬取的域名)和start_urls(起始URL)。 在parse()方法中,我们使用XPath表达式来提取每部电影的标题,并将其作为一个字典的值返回。我们还使用XPath表达式来提取下一页的URL,并使用Scrapy的Request对象获取该URL并继续调用parse()方法。 最后,我们需要在命令行中运行以下命令来启动这个爬虫: ``` scrapy crawl douban_movie -o movies.json ``` 这个命令将使用我们刚刚编写的爬虫爬取豆瓣电影Top250,并将结果保存为JSON文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值