Scrapy неправильно выдал вывод для другого базового URL? - PullRequest
1 голос
/ 18 октября 2019

Я все еще начинающий и изучаю Scrapy

Так что я делаю скрипт Scrapy, чтобы очистить количество ссылок на rumah123.com, ровно на https://www.rumah123.com/en/sale/surabaya/surabaya-kota/all-residential/,, и это получается успешно! он выдает csv ссылок

Но когда я изменил ссылку на https://www.rumah123.com/en/rent/surabaya/surabaya-kota/all-residential/, Мой скрипт Scrapy ничего не выдал

Когда я запускаю скрипт, Scrapy Log точно говорит:

2019-10-18 13:02:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.rumah123.com/en/rent/surabaya/surabaya-kota/all-residential/> (referer: None)
2019-10-18 13:02:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.rumah123.com/en/rent/surabaya/surabaya-kota/all-residential/?page=2> (referer: None)
2019-10-18 13:02:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.rumah123.com/en/rent/surabaya/surabaya-kota/all-residential/?page=6> (referer: None)
2019-10-18 13:02:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.rumah123.com/en/rent/surabaya/surabaya-kota/all-residential/?page=5> (referer: None)
2019-10-18 13:02:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.rumah123.com/en/rent/surabaya/surabaya-kota/all-residential/?page=7> (referer: None)
2019-10-18 13:02:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.rumah123.com/en/rent/surabaya/surabaya-kota/all-residential/?page=4> (referer: None)
2019-10-18 13:02:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.rumah123.com/en/rent/surabaya/surabaya-kota/all-residential/?page=8> (referer: None)
2019-10-18 13:02:06 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.rumah123.com/en/rent/surabaya/surabaya-kota/all-residential/?page=9> (referer: None)
2019-10-18 13:02:06 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.rumah123.com/en/rent/surabaya/surabaya-kota/all-residential/?page=10> (referer: None)
2019-10-18 13:02:16 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.rumah123.com/en/rent/surabaya/surabaya-kota/all-residential/?page=3> (referer: None)
2019-10-18 13:02:16 [scrapy.core.engine] INFO: Closing spider (finished)

Но когда я проверяю настоящий CSV, он ничего не содержит внутри!

Это весь код скриптов:

class Rumah123_Spyder(scrapy.Spider):
    name = "Home_Rent"
    url_list = []
    page = 1
    def start_requests(self):
        headers = {
            'accept-encoding': 'gzip, deflate, sdch, br',
            'accept-language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4',
            'upgrade-insecure-requests': '1',
            'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'cache-control': 'max-age=0',
        }
        #base = 'https://www.rumah123.com/en/sale/surabaya/surabaya-kota/all-residential/'
        base = 'https://www.rumah123.com/en/rent/surabaya/surabaya-kota/all-residential/'
        for x in range(10): #depends on number of page in search results
            if x==0:
                yield scrapy.Request(url=base, headers=headers, callback=self.parse)
                self.page += 1
            else:
                yield scrapy.Request(url=base + "?page=" + str(self.page), headers=headers, callback=self.parse)
                self.page += 1

        #Filter a not valid URL 
        self.url_list = [rum for rum in self.url_list if "/property/" in rum]
        for x in range(len(self.url_list)):
            self.url_list[x] = "rumah123.com" + self.url_list[x]

        url_df = pd.DataFrame(self.url_list, columns=["Sub URL"])
        #url_df.to_csv("home_sale_link.csv", encoding="utf_8_sig")
        url_df.to_csv("home_rent_link.csv", encoding="utf_8_sig")

    def parse(self, response):
        for rumah in response.xpath('//a/@href'):
            if rumah.get() not in self.url_list:
                self.url_list.append(rumah.get())

from scrapy import cmdline
cmdline.execute("scrapy runspider Rumah123_url.py".split())

Ожидаемые результаты такие же, как вПервая попытка URL, вот скриншот ссылок:

https://imgur.com/eynTo5W

Текущий результат для "арендного" URL пуст, вот скриншот:

https://imgur.com/a/iUdRUDt

Дополнительное примечание: я тестировал запуск с использованием scrapy shell https://www.rumah123.com/en/sale/surabaya/surabaya-kota/all-residential/, Если я запускаю код вручную, он может напрямую генерировать CSV, но он будет очень утомительным при выполнении кода одинна одном: (

Может ли кто-нибудь указать мне, почему это может произойти? Спасибо:)

Ответы [ 3 ]

1 голос
/ 18 октября 2019

Извлечение URL-адреса в нашей процедуре импорта пауков

class QuotesSpider(scrapy.Spider):
    name = "quotes"    
    start_urls = ['https://www.rumah123.com/en/rent/surabaya/surabaya-kota/all-residential/?page=' + str(i) for i in range(1, 10)]

    def parse(self, response):
        for quote in response.xpath('//*[@class="sc-bRbqnn iRnfmd"]'):
            yield {
                'url1': quote.xpath('a/@href').extract(),
            }

Самый простой способ сохранить очищенные данные - использовать экспорт фидов с помощью следующей команды:

scrapy crawl quotes -o 1.csv
0 голосов
/ 18 октября 2019

Я выяснил проблемы! Изменив количество циклов с 10 на что-то большее, чем 30, My CSV теперь заполнен списком URL! хотя я действительно не знаю, почему это работает

for x in range(30): #depends on number of page in search results
    if x==0:
        yield scrapy.Request(url=base, headers=headers, callback=self.parse)
        self.page += 1
    else:
        yield scrapy.Request(url=base + "?page=" + str(self.page), headers=headers, callback=self.parse)
    self.page += 1
0 голосов
/ 18 октября 2019

Проблема в том, что ваш паук ничего не дает.

Вы можете попробовать следующий parse метод

def parse(self, response):
        for rumah in response.xpath('//a/@href'):
            if rumah.get() not in self.url_list:
                self.url_list.append(rumah.get())
        yield {'result': self.url_list}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...