python爬虫从入门到放弃之十五:Scrapy爬取多个页面

——在上文,我们用Scrapy爬取糗事百科段子的首页,接下来我们来完善之前的代码,爬取多个页面,并保存到本地csv、Excel文件

  • 项目回顾

上文的项目流程:

  1. settings.py:忽略robots协议、设置user-agent、关闭讨厌的日志生成
  2. qsbk.py:爬取糗事百科首页段子
  3. run.py:运行爬虫
  4. items.py:定义数据模型
  5. pipelines.py:保存为json数据
  6. settings.py:激活pipeline

scrapy项目流程:
1.建立scrapy项目和爬虫

打开Python编辑器,打开要存放项目的目录,在终端执行以下命令:

scrapy startproject myspider
cd myspider
scrapy genspider qsbk qiushibaike.com


2.设置文件 settings.py
BOT_NAME = 'myspider'

SPIDER_MODULES = ['myspider.spiders']
NEWSPIDER_MODULE = 'myspider.spiders'

LOG_LEVEL = 'WARN'

USER_AGENT = 'Mozilla/5.0'

ROBOTSTXT_OBEY = False


3.定义数据模型 items.py
import scrapy

class MyspiderItem(scrapy.Item):
    content = scrapy.Field()
    link = scrapy.Field()


4.运行爬虫代码 run.py

事先写好可以在编辑器运行爬虫的代码,而不是每次输入命令行,方便调试,方法是在项目目录下创建一个run.py文件(文件名随便),输入以下代码:

from scrapy import cmdline

cmdline.execute('scrapy crawl qsbk'.split())


5.编写爬虫代码 qsbk.py

以下是上文爬取糗事百科段子的首页的代码:

# -*- coding: utf-8 -*-
import scrapy
from myspider.items import MyspiderItem

class QsbkSpider(scrapy.Spider):
    name = 'qsbk'
    allowed_domains = ['qiushibaike.com']
    start_urls = ['https://www.qiushibaike.com/text/page/1/'] 
 
    def parse(self, response):
        articles = response.xpath('//div[@id="content-left"]/div')
        for article in articles:
            link = 'https://www.qiushibaike.com'+ article.xpath('./a/@href').get()
            content = article.xpath('./a/div/span/text()').get().strip()
            print(content,link)
            

接下来我们来分析糗事百科的段子页面,实现爬取多个页面

python爬虫从入门到放弃之十五:Scrapy爬取多个页面_第1张图片

可以发现,下一页的链接在最后一个li标签里面,这里是部分链接,还要加上它的基本域名https://www.qiushibaike.com

代码实现:

# -*- coding: utf-8 -*-
import scrapy
from myspider.items import MyspiderItem

class QsbkSpider(scrapy.Spider):
    name = 'qsbk'
    allowed_domains = ['qiushibaike.com']
    start_urls = ['https://www.qiushibaike.com/text/page/1/'] 
    # 在此处定义一个变量,基本域名
    base_domain = 'https://www.qiushibaike.com'
 
    def parse(self, response):
        articles = response.xpath('//div[@id="content-left"]/div')
        for article in articles:
            link = 'https://www.qiushibaike.com'+ article.xpath('./a/@href').get()
            content = article.xpath('./a/div/span/text()').get().strip()

            items = MyspiderItem(content = content,link = link)
            yield items
        
        # 获取下一页的链接
        next_url = response.xpath('//ul[@class="pagination"]/li[last()]/a/@href').get()
        # 判断下一页是否存在,存在则提交Requests对象,返回Response对象再回调parse()函数
        if not next_url:
            return
        else:
            yield scrapy.Request(self.base_domain+next_url,callback=self.parse)


  • 下载延迟和激活管道 settings.py

此时因为我们的爬取量大了,就要设置下载延迟,不要让它爬太快,以免把别人的服务器搞垮了

打开设置文件settings.py,将下载延迟设置为1秒,激活管道

BOT_NAME = 'myspider'

SPIDER_MODULES = ['myspider.spiders']
NEWSPIDER_MODULE = 'myspider.spiders'

LOG_LEVEL = 'WARNING'

USER_AGENT = 'Mozilla/5.0'

ROBOTSTXT_OBEY = False

DOWNLOAD_DELAY = 1

ITEM_PIPELINES = {
    'myspider.pipelines.MyspiderPipeline': 300,
}


  • 存储文件 pipelins.py

1.保存为csv文件

import csv

class MyspiderPipeline(object):

    def open_spider(self, spider):
        print('爬虫开始了...')
        self.file= open('duanzi.csv','w',newline='',encoding = 'utf-8-sig')
        self.writer =csv.writer(self.file)
        self.writer.writerow(['段子','链接'])

    def process_item(self, item, spider):
        self.writer.writerow([item['content'],item['link']])
        return item
   
    def close_spider(self, spider):
        self.file.close()
        print('爬虫结束了...')

2.保存为Excel表格

import openpyxl

class MyspiderPipeline(object):

    def __init__(self):
        print('爬虫开始了...')
        self.wb = openpyxl.Workbook()
        self.ws = self.wb.active
        self.ws.append(['段子','链接'])

    def process_item(self, item, spider):
        self.ws.append([item['content'],item['link']])
        return item
    
    def close_spider(self, spider):
        self.wb.save('./duanzi.xlsx')
        self.wb.close()
        print('爬虫结束了...')



>>>阅读更多文章请点击以下链接:

python爬虫从入门到放弃之一:认识爬虫
python爬虫从入门到放弃之二:HTML基础
python爬虫从入门到放弃之三:爬虫的基本流程
python爬虫从入门到放弃之四:Requests库基础
python爬虫从入门到放弃之五:Requests库高级用法
python爬虫从入门到放弃之六:BeautifulSoup库
python爬虫从入门到放弃之七:正则表达式
python爬虫从入门到放弃之八:Xpath
python爬虫从入门到放弃之九:Json解析
python爬虫从入门到放弃之十:selenium库
python爬虫从入门到放弃之十一:定时发送邮件
python爬虫从入门到放弃之十二:多协程
python爬虫从入门到放弃之十三:Scrapy概念和流程
python爬虫从入门到放弃之十四:Scrapy入门使用
python爬虫从入门到放弃之十五:ScrapyScrapy爬取多个页面
python爬虫从入门到放弃之十六:Xpath简化
python爬虫从入门到放弃之十七:常见反爬手段
python爬虫已放弃,视频教程资源来领取

你可能感兴趣的:(python爬虫从入门到放弃之十五:Scrapy爬取多个页面)