Python3网络爬虫教程18——分布式爬虫Scrapy实例(爬取一个页面)

Python 全栈工程师核心面试 300 问深入解析(2020 版)----全文预览

Python 全栈工程师核心面试 300 问深入解析(2020 版)----欢迎订阅

上接:
Python3网络爬虫教程17——分布式爬虫Scrapy基础
https://blog.csdn.net/u011318077/article/details/86692451

4. 简单实例(爬取一条名言)

  • 创建一个简单的爬虫实例

    • 第一步:创建一个scrapy项目
      • 创建命令:scrapy startproject mingyan2(mingyan2是我取的项目文件夹名称)
      • 打开CMD窗口,CD命令切换到要放置爬虫项目文件夹下面,然后执行上述命令
      • 执行命令及文件夹下面的有哪些东西参考: 爬虫1.png 爬虫2.png
    • 第二步:编写爬虫的主程序py文件
      • 在spiders文件夹下新建mingyan_spider.py文件
      • 然后里面编写代码
      • 参考mingyan_spider.py文件
    • 第三步:执行爬虫命令
      • CD到刚刚的项目文件mingyan2下
      • 执行命令:scrapy crawl mingyan2
      • 刚刚主程序里面定义了一个,name = ‘mingyan2’
      • 上面的命令中的mingyan2是这个name的名称,不是文件夹的名称,只不过这里名称一样
      • 执行结束后,mingyan2文件下自动保存了刚刚爬取到的两个url的页面
      • 参考: 爬虫3.png
        Python3网络爬虫教程18——分布式爬虫Scrapy实例(爬取一个页面)_第1张图片
  • 参考实例mingyan_spider.py

import scrapy

# 定义一个mingyan类,继承Spider父类
class mingyan(scrapy.Spider):

    # 定义蜘蛛名
    name = 'mingyan2'

    # 此方法通过下面链接爬取页面
    def start_requests(self):
        urls = [
            'http://lab.scrapyd.cn/page/1/',
            'http://lab.scrapyd.cn/page/2/',
            'http://lab.scrapyd.cn/page/3/',
        ]

        # 爬取到的页面直接调用下面定义的parse方法处理
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):

        '''
        start_requests已经爬取到页面,那如何提取我们想要的内容呢?那就可以在这个方法里面定义。
        这里的话,并木有定义,只是简单的把页面做了一个保存,并没有涉及提取我们想要的数据,后面会慢慢说到
        也就是用xpath、正则、或是css进行相应提取,这个例子就是让你看看scrapy运行的流程:
        1、定义链接;
        2、通过链接爬取(下载)页面;
        3、定义规则,然后提取数据;
        就是这么个流程,似不似很简单呀?
        '''

        # 根据url请求得到页面,提取里面的页码,如:/page/1/,提取到倒数第二个元素的就是:1
        page = response.url.split('/')[-2]

        # 拼接文件名称,如果是第一页,最终文件名便是:mingyan-1.html
        filename = 'mingyan-%s.html' % page

        # 保存爬取到的网页内容
        # wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
        with open(filename, 'wb') as f:
            # 将下载页面中的body标签下的内容写入
            f.write(response.body)

5. scrapy shell使用

  • scrapy调试工具
  • CMD窗口切换到项目文件下执行命令:scrapy shell 网址
    • scrapy shell http://lab.scrapyd.cn
    • scrapy shell http://www.baidu.com
  • 退出调试执行命令:exit
  • 参考: 爬虫4.png 爬虫5.png
    Python3网络爬虫教程18——分布式爬虫Scrapy实例(爬取一个页面)_第2张图片
    Python3网络爬虫教程18——分布式爬虫Scrapy实例(爬取一个页面)_第3张图片

6. scrapy css选择器使用(爬取一页的名言)

  • 执行调试命令:scrapy shell http://lab.scrapyd.cn
  • 先提取HTML的title: response.css(‘title’)
    • 得到一个Selector的列表
    • []
    • 换种写法,每次可以得到不同的结果
    • response.css(‘title’).extract()
      [‘爬虫实验室 - SCRAPY中文网提供’]
    • response.css(‘title’).extract()[0]
      ‘爬虫实验室 - SCRAPY中文网提供’
    • response.css(‘title’).extract_first()
      ‘爬虫实验室 - SCRAPY中文网提供’
    • response.css(‘title::text’).extract_first()
      ‘爬虫实验室 - SCRAPY中文网提供’
  • 我们其实一般都值需要标签里面的具体内容所有执行
    • response.css(‘title::text’).extract_first()
      • 参考:爬虫6.png
        Python3网络爬虫教程18——分布式爬虫Scrapy实例(爬取一个页面)_第4张图片

6.1. scrapy css选择器进一步使用

  • 先项目文件下执行:scrapy shell http://lab.scrapyd.cn

  • 接着执行: mingyan1 = response.css(‘div.quote’)[0]

  • 每一段名言都被一个

    ……
    包裹

  • 我们就把第一段名言保存在:mingyan1 这么一个变量里面了。

  • 为什么会有一个:[0] 这表示提取第一段,如果没有这个限制,那我们提取的是本页所有名言

  • 网页源码


    看官,此页面只为爬虫练习使用,都是残卷,若喜欢可以去找点高清版!
    作者:中国传世名画
    【详情】



    标签: 艺术,
    名画

  • 继续执行:mingyan1.css(’.text::text’).extract_first()

  • 使用了:.text这是class选择器,提取第一个内容

  • mingyan1.css(’.tags .tag::text’).extract()

  • 我们用的并非是.extract_first() 而是 extract(),why?应为里面有多个标签,我们并非只是提取一个,

  • 而是要把所有标签都提取出来,因此就用了:.extract()

  • 并且用了两次标签tags,意思是提取第二个标签里面的内容

  • 参考:爬虫7.png

  • 参考网址:http://www.scrapyd.cn/doc/147.html

  • 参考实例ItemSpider.py

  • 参考实例ListSpider.py
    Python3网络爬虫教程18——分布式爬虫Scrapy实例(爬取一个页面)_第5张图片
    ItemSpider.py

# 提取http://lab.scrapyd.cn中的五条名言
# 分别按编号+作者的方式保存为5个文件

import scrapy

# 定义一个mingyan类,继承Spider父类
class ItemSpider(scrapy.Spider):

    # 定义蜘蛛名
    name = 'ItemSpider'
    start_urls = ['http://lab.scrapyd.cn']

    def parse(self, response):

        # 提取页面中的所有的名言
        mingyanPage1 = response.css('div.quote')

        number1 = 0

        for mingyan in mingyanPage1:
            # 提取css中text标签对应的文字内容,名言的正文
            text = mingyan.css('.text::text').extract_first()
            # 提取作者
            author = mingyan.css('.author::text').extract_first()
            # 提取标签
            tags = mingyan.css('.tags .tag::text').extract()
            # 数组转换为字符串
            tags = ', '.join(tags)
            # 将爬去的内容存入文件,文件名为:编号. 作者-语录.txt
            number1 += 1
            filename =  '%s. %s-语录.txt' %(number1, author)
            # 以写的方式打开文件并写入内容
            with open(filename, "w") as f:
                f.write(text)
                f.write('\n')
                f.write('标签: ' + tags)
                f.close()

ListSpider.py

# 提取http://lab.scrapyd.cn中的五条名言
# 相同作者的名言保存在一个文件中,采用追加的方式写入

import scrapy

# 定义一个mingyan类,继承Spider父类
class ListSpider(scrapy.Spider):

    # 定义蜘蛛名
    name = 'ListSpider'
    start_urls = ['http://lab.scrapyd.cn']

    def parse(self, response):

        # 提取页面中的所有的名言
        mingyanPage1 = response.css('div.quote')

        for mingyan in mingyanPage1:
            # 提取css中text标签对应的文字内容,名言的正文
            text = mingyan.css('.text::text').extract_first()
            # 提取作者
            author = mingyan.css('.author::text').extract_first()
            # 提取标签
            tags = mingyan.css('.tags .tag::text').extract()
            # 数组转换为字符串
            tags = ', '.join(tags)
            # 将爬去的内容存入文件,文件名为:编号. 作者-语录.txt
            filename =  '%s-语录.txt' %(author)
            # 以追加的方式写入文件,文件名相同(即作者相同),会写在同一个文件
            with open(filename, "a+") as f:
                f.write(text)
                f.write('\n')
                f.write('标签: ' + tags)
                f.write('\n---------------\n')
                f.close()

本章案例源代码及输出结果图片查看GITHUB:
https://github.com/FangbaiZhang/TLXY_study_note/tree/master/Spider

Python3网络爬虫教程19——分布式爬虫Scrapy实例(爬取多个页面)
https://blog.csdn.net/u011318077/article/details/86692733

你可能感兴趣的:(网络爬虫,Python3网络爬虫教程,Scrapy,分布式爬虫,Shell)