利用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"] + "\n")
        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 (不打印日志) 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM