Scrapy Запись в отдельные файлы для каждой под-ссылки на сайте новостной статьи онлайн - PullRequest
0 голосов
/ 23 февраля 2020

Я пытался очистить этот сайт "https://bangla.bdnews24.com/". Я использую Python3.

Вот мой код паука:

import scrapy 
import hashlib

class PostsSpider(scrapy.Spider):
    name = "posts"
    start_urls = [
        'https://bangla.bdnews24.com/'
    ]
    direc = ''

    def parse(self, response):
        #get all the article links
        post_link_list = response.xpath('//a[contains(@href, "article")]/@href').extract()

        #follow link one by one 
        for post in post_link_list:
            hashed_url = self.hashcodes(post).upper()
            self.direc = hashed_url + '.json'
            yield response.follow(post, callback=self.parse_post)

    def parse_post(self, response):
        items = {}
        items['title'] = response.css('#news-details-page .print-only::text').get(),
        items['date'] = response.css('#article_notations span:nth-child(2)::text').get(),
        items['content'] = response.css('#storyBody p::text , .article_lead_text .print-only::text').extract()
        with open(self.direc, 'w', encoding="utf-8") as f:
            f.write(str(items))
        yield items

    def hashcodes(self, url):
        hc = hashlib.md5(url.encode())
        return hc.hexdigest()

Я собираю сначала все URL-адреса с главной страницы, а затем следую за ними один за другим. и соскребая данные с тех, разбирая их. Также кодирую ссылки Я хочу поместить отдельные данные, очищенные ссылками, в отдельные файлы json; используя закодированные ссылки в качестве имен локальных каталогов. Но проблема, с которой я сталкиваюсь, заключается в том, что создается только один файл json, и все очищенные данные из всех ссылок попадают в этот один файл, где очищенные данные одной ссылки перезаписываются ближайшие. Поэтому у меня остался один json файл, в котором хранится только последняя ссылка - очищенные данные.

Буду признателен за любые советы о том, как я могу обновить свой код для этого. Заранее спасибо.

1 Ответ

0 голосов
/ 24 февраля 2020

Я решил проблему. Проблема в том, что parse_post () не получал URL текущей страницы или переменную "self.dire c". Я удалил переменную self.dire c и добавил эту строку внутри parse_post () -

hashed_url = self.hashcodes(response.request.url).upper()

Вот окончательный код -

class PostsSpider(scrapy.Spider):
    name = "posts"
    start_urls = [
        'https://bangla.bdnews24.com/'
    ]


    def parse(self, response):
        #get all the article links
        post_link_list = response.xpath('//a[contains(@href, "article")]/@href').extract()

        #follow link one by one 
        for post in post_link_list:
            yield scrapy.Request(post, callback=self.parse_post)


    def parse_post(self, response):
        items = {}
        items['title'] = response.css('#news-details-page .print-only::text').get(),
        items['date'] = response.css('#article_notations span:nth-child(2)::text').get(),
        items['content'] = response.css('#storyBody p::text , .article_lead_text .print-only::text').extract()

        #get the current page url and encode it 
        hashed_url = self.hashcodes(response.request.url).upper()
        direc = hashed_url + '.json'

        #write single page scraped data onto individual files
        with open(direc, 'w', encoding='utf-8') as f:
            json.dump(items, f, ensure_ascii=False)

        yield items


    def hashcodes(self, url):
        hc = hashlib.md5(url.encode())
        return hc.hexdigest()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...