zoukankan      html  css  js  c++  java
  • 利用scrapy获取抽屉新热榜的标题和内容以及新闻地址保存到本地

    1、安装scrapy

      pip3 install scrapy

    2、打开terminal,cd 到想要创建程序的目录下

    3、创建一个scrapy项目

      在终端输入:scrapy startproject my_first_scrapy(项目名)

    4、在终端输入:cd my_first_scrapy  进入到项目目录下

    5、新建爬虫:

      输入: scrapy genspider chouti chouti.com  (chouti: 爬虫名称, chouti.com : 要爬取的网站的起始网址)

    6、在pycharm中打开my_first_scrapy,就可以看到刚才创建的项目:

    7、打开settings.py可以对项目相关参数进行设置,如设置userAgent:

    8、打开chouti.py编写代码:

    # -*- coding: utf-8 -*-
    """
    获取抽屉新热榜的标题和内容以及新闻地址保存到本地
    """
    import scrapy
    from scrapy.http import Request
    from scrapy.http.response.html import HtmlResponse
    from ..items import MyFirstScrapyItem
    
    
    class ChoutiSpider(scrapy.Spider):
        name = 'chouti'
        allowed_domains = ['chouti.com']
        start_urls = ['http://chouti.com/']
    
        def parse(self, response):
            # print(response, type(response))  # <class 'scrapy.http.response.html.HtmlResponse'>
            # print(response.text)
            
            # 解析文本内容, 提取标题和简介,地址
    
            # 去页面中找id=content-list的div标签,再去这个div下找class=item的div
            items = response.xpath("//div[@id='content-list']/div[@class='item']")
            # "//"表示从html文件的根部开始找。"/"表示从儿子里面找。".//"表示相对的,及当前目录下的儿子里面找
            for item in items:
                # 当前目录下找class=part1的div标签,再找div标签下的a标签的文本信息text(),并且只取第一个
                # a标签后面可以加索引,表示取第几个a标签,如第一个:a[0]
                title = item.xpath(".//div[@class='part1']/a/text()").extract_first().strip()  # 去掉标题两端的空格
                href = item.xpath(".//div[@class='part1']/a/@href").extract_first().strip()  # 取href属性
                summary = item.xpath(".//div[@class='area-summary']/span/text()").extract_first()
                # print(1, title)
                # print(2, href)
                # print(3, summary)
                item_obj = MyFirstScrapyItem(title=title, href=href, summary=summary)  # 实例化
                yield item_obj  # 将数据交给pipelines
    
            # 获取页码
            page_list = response.xpath("//div[@id='dig_lcpage']//a/@href").extract()
            for url in page_list:
                url = "https://dig.chouti.com%s" % url
                yield Request(url=url, callback=self.parse)  # 下载页面内容
    View Code

    9、打开items.py写代码:

    # -*- coding: utf-8 -*-
    
    # Define here the models for your scraped items
    #
    # See documentation in:
    # https://doc.scrapy.org/en/latest/topics/items.html
    
    import scrapy
    
    
    class MyFirstScrapyItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        # 规则化:将要持久化的数据转化为某种格式
        title = scrapy.Field()
        href = scrapy.Field()
        summary = scrapy.Field()
    View Code

    10、打开pipelines.py写代码:

    """
    1、先去类中找from_crawler
        有:执行且必须返回一个当前类的对象
        没有:不执行,则去执行构造方法__init__(self)并返回一个对象
    2、再去执行"对象.其他方法"
    """
    
    
    class MyFirstScrapyPipeline(object):
        def __init__(self, file_path):
            self.f = None
            self.file_path = file_path
    
        @classmethod
        def from_crawler(cls, crawler):
            """
            初始化时,用于创建pipelines对象
            :param crawler:
            :return:
            """
            file_path = crawler.settings.get("CHOUTI_NEWS_PATH")  # 存储文件的路径
            return cls(file_path)
    
        def open_spider(self, spider):
            """
            打开文件
            :param spider:提交数据过来的爬虫对象
            :return:
            """
            self.f = open(self.file_path, "a+", encoding="utf-8")
    
        def process_item(self, item, spider):
            """
            :param item: 爬虫中yield过来的item对象
            :param spider:提交数据过来的爬虫对象
            :return:
            """
            self.f.write(item["href"] + "
    ")
            self.f.flush()  # 将内容强刷到硬盘进行保存
            return item
    
        def close_spider(self, spider):
            """
            关闭文件
            :param spider:提交数据过来的爬虫对象
            :return:
            """
            self.f.close()
    View Code

    11、在settings.py中找到 ITEM_PIPELINES进行设置,并设置存储下载的新闻存储的文件路径:

    12、运行爬虫项目,在终端输入:

      scrapy crawl chouti(会打印日志)  或者 scrapy crawl chouti --nolog (不打印日志) 

      

  • 相关阅读:
    [不知道哪来的题] Subsequence
    [不知道哪来的题] 变量(variable)
    [不知道哪来的题] 串(string)
    LOJ#500. 「LibreOJ β Round」ZQC 的拼图
    Codeforces855C Helga Hufflepuff's Cup
    Codeforces895C Square Subsets
    Codeforces757D Felicity's Big Secret Revealed
    bzoj3694 最短路
    maven安装时报错的问题
    java static关键字
  • 原文地址:https://www.cnblogs.com/yanlin-10/p/9820800.html
Copyright © 2011-2022 走看看