zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    useState 的介绍和多状态声明(二)
    PHP:相对于C#,PHP中的个性化语法
    PHP:IIS下的PHP开发环境搭建
    PHP:同一件事,有太多的方式
    Javascript:再论Javascript的单线程机制 之 DOM渲染时机
    Javascript:拦截所有AJAX调用,重点处理服务器异常
    DDD:谈谈数据模型、领域模型、视图模型和命令模型
    .NET:再论异常处理,一个真实的故事
    Javascript:由 “鸭子类型” 得出来的推论
    Workflow:采用坐标变换(移动和旋转)画箭头
  • 原文地址:https://www.cnblogs.com/yjlch1016/p/9266065.html
Copyright © 2011-2022 走看看