• Scrapy爬博客园


    D:
    进入D盘

    scrapy startproject cnblogs
    创建博客园项目

    cd cnblogs
    进入项目根目录

    scrapy genspider blog cnblogs.com
    创建爬虫文件

     

    blog.py:

    # -*- coding: utf-8 -*-
    import scrapy


    class BlogSpider(scrapy.Spider):
    name = 'blog'
    allowed_domains = ['cnblogs.com']
    start_urls = ['https://www.cnblogs.com/']

    def parse(self, response):
    homePage = response.css('.post_item_body')
    # 提取首页展示的正文,保存至变量homePage

    for v in homePage:
    # 循环获取每一条里面的标题与作者
    titlelnk = v.css('.titlelnk::text').extract_first()
    # 提取标题
    lightblue = v.css('.lightblue::text').extract_first()
    # 提取作者

    """
    接下来进行写文件操作,每个作者的帖子储存在一个txt文档里面
    """
    fileName = '%s-帖子.txt' % lightblue
    # 定义文件名,如:作者-帖子.txt

    with open(fileName, "a+") as f:
    # 不同作者的标题保存在不同的txt文档,“a+”以追加的形式
    f.write(titlelnk)
    f.close()


    scrapy crawl blog
    运行爬虫

    首页展示的20条博客的标题和作者:

    爬取下一页:

    blog.py:

    # -*- coding: utf-8 -*-
    import scrapy


    class BlogSpider(scrapy.Spider):
    name = 'blog'
    allowed_domains = ['cnblogs.com']
    start_urls = ['https://www.cnblogs.com/']

    def parse(self, response):
    homePage = response.css('.post_item_body')
    # 提取首页展示的正文,保存至变量homePage

    for v in homePage:
    # 循环获取每一条里面的标题与作者
    titlelnk = v.css('.titlelnk::text').extract_first()
    # 提取标题
    lightblue = v.css('.lightblue::text').extract_first()
    # 提取作者

    """
    接下来进行写文件操作,每条帖子的标题储存在一个txt文档里面
    """
    fileName = '%s-帖子.txt' % lightblue
    # 定义文件名,如:作者-帖子.txt

    with open(fileName, "a+") as f:
    # 不同作者的标题保存在不同的txt文档,“a+”以追加的形式
    f.write(titlelnk)
    f.close()

    """
    接下来我们需要判断下一页是否存在,
    如果存在,
    我们需要继续提交给parse执行
    关键看scrapy如何实现链接提交
    """
    next_page = response.css('.pager a:contains("Next")::attr(href)').extract_first()
    # css选择器提取下一页链接

    if next_page is not None:
    # 判断是否存在下一页
    """
    如果是相对路径,如:/page/1
    urljoin能把相对地址转换成绝对地址
    最终next_page为:https://www.cnblogs.com/#p2
    """
    next_page = response.urljoin(next_page)

    """
    接下来就是爬取下一页或是内容页的秘诀所在:
    scrapy给我们提供了这么一个方法:scrapy.Request()
    这个方法还有许多参数,后面我们慢慢说,这里我们只使用了两个参数
    一个是:我们继续爬取的链接(next_page),这里是下一页链接,当然也可以是内容页
    另一个是:我们要把链接提交给哪一个函数(callback=self.parse)爬取,这里是parse函数,也就是本函数
    当然,我们也可以在下面另写一个函数,比如:内容页,专门处理内容页的数据
    经过这么一个函数,下一页链接又提交给了parse,那就可以不断的爬取了,直到不存在下一页
    """
    yield scrapy.Request(next_page, callback=self.parse)
  • 相关阅读:
    缓冲区溢出攻击练习
    小例子背后的大道理——从DIP中“倒置”的含义说接口的正确使用
    关于.NET里String.Compare与C++的不同,请高人解释下为什么这样?
    详解Adorner Layer
    百度文库手机版通信协议分析
    这段.NET Framework的源代码似乎有很大的优化空间
    在ListView的GroupItem头中显示每列的Summary
    随机抽奖
    MySQL的多表查询(笛卡尔积原理) 1
    采用Apache服务器的虚拟主机设置伪静态教程
  • 原文地址:https://www.cnblogs.com/yjlch1016/p/9266065.html
Copyright © 2020-2023  润新知