使用scrapy框架爬取菜鸟教程上python3教程,并保存为txt文档。

一、使用工具:

python3.7、pycharm、scrapy

二、实现步骤

1、选择文件夹创建scrapy文件。首先打开cmd控制台,cd到scrapy文件夹,输入 scrapy stratproject [ ],其中【】输入你所创建的文件夹名称。

然后cd csdn,注:我创建的文件夹为csdn,在文件夹下输入 scrapy genspider -t crawl csdn_url runoob.com,其中csdn_url是python文件名, runoob.com为菜鸟教程域名。该方法能够爬取一定规则的网页,之后会讲到。

创建完的文件夹内容如下:

最后,为了在pycharm能够运行该文件,在csdn目录下创建一个start.py,内容如下:

from scrapy import cmdline

cmdline.execute("scrapy crawl csdn_url".split())

2、scrapy基本信息设置

首先在settings.py中进行以下设置

然后分析菜鸟教程网页,将抓取原则写入csdn_url.py,直接上代码,其中start_urls为初始网页链接,rule是设定的代码规则,菜鸟教程中的链接都是https://www.runoob.com/python3/python3-作为前缀。

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from csdn.items import CsdnItem

class CsdnUrlSpider(CrawlSpider):
    name = 'csdn_url'
    allowed_domains = ['runoob.com']
    start_urls = ['https://www.runoob.com/python3/python3-tutorial.html']

    rules = (
        Rule(LinkExtractor(allow=r'https://www.runoob.com/python3/python3-+'), callback='parse_item', follow=False),
    )

    def parse_item(self, response):
        name = response.xpath('//div[@class="article-intro"]/h1/text()').get()
        if response.xpath('//div[@class="article-intro"]/h1/span/text()').get():
            name += response.xpath('//div[@class="article-intro"]/h1/span/text()').get()
        contents = response.xpath('//div[@class="article-intro"]//text()').getall()
        title = []
        title.append(name)
        if response.xpath('//div[@class="article-intro"]/h2/text()').get():
            title_2 = response.xpath('//div[@class="article-intro"]/h2/text()').getall()
            title += title_2
        if response.xpath('//div[@class="article-intro"]/h3/text()').get():
            title_3 = response.xpath('//div[@class="article-intro"]/h3/text()').getall()
            title += title_3
        print("===============")
        print(name)
        print(title)
        content_list = []
        for i in contents:
            # if content=="\r\n":
            #     continue
            if "\t" in i:
                continue
            if "\n" in i:
                continue
            if i in title:
                content_list.append("\n")
            content_list.append(i.strip())
            if i in title:
                content_list.append("\n")
        content = " ".join(content_list)
        print(content)
        item = CsdnItem(name=name, content=content)
        print(item)
        yield item

再设置items.py,本案例只爬取教程标题和内容:

import scrapy

class CsdnItem(scrapy.Item):
    name = scrapy.Field()
    content = scrapy.Field()

最后在pipelines.py设置储存方式与路径,分别储存为json格式和txt格式:

from scrapy.exporters import JsonLinesItemExporter

class CsdnPipeline(object):
    def process_item(self, item, spider):
        self.fp = open("cainiao.json", "wb")
        self.ft = open("cainiao.txt", "a", encoding="utf-8")
        self.ft.write(str(item["name"]) + '\n')
        self.ft.write(str(item["content"]) + '\n\t')
        self.exporter = JsonLinesItemExporter(self.fp, ensure_ascii=False, encoding="utf-8")
        self.exporter.export_item(item)
        return item

    def close_spider(self, spider):
        self.fp.close()
        self.ft.close()

3、结果如下

原网页

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值