Scrapy + Splash + ScrapyJS

я использую Splash 2.0.2 + Scrapy 1.0.5 + Scrapyjs 0.1.1, и я все еще не могу отображать javascript одним щелчком мыши. Вот пример URL-адреса https://olx.pt/anuncio/loja-nova-com-250m2-garagem-em-box-fechada-para-arrumos-IDyTzAT.html#c49d3d94cf

Я все еще получаю страницу без отображаемого номера телефона:

class OlxSpider(scrapy.Spider):
    name = "olx"
    rotate_user_agent = True
    allowed_domains = ["olx.pt"]
    start_urls = [
        "https://olx.pt/imoveis/"
    ]

    def parse(self, response):
        script = """
        function main(splash)
            splash:go(splash.args.url)
            splash:runjs('document.getElementById("contact_methods").getElementsByTagName("span")[1].click();')
            splash:wait(0.5)
            return splash:html()
        end
        """
        for href in response.css('.link.linkWithHash.detailsLink::attr(href)'):
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse_house_contents, meta={
                'splash': {
                    'args': {'lua_source': script},
                    'endpoint': 'execute',
                }
            })

        for next_page in response.css('.pager .br3.brc8::attr(href)'):
            url = response.urljoin(next_page.extract())
            yield scrapy.Request(url, self.parse)

    def parse_house_contents(self, response):

        import ipdb;ipdb.set_trace()

как я могу заставить это работать?


person psychok7    schedule 03.03.2016    source источник


Ответы (2)


Вы можете не использовать Splash в первую очередь и сделать соответствующий запрос GET, чтобы получить номер телефона самостоятельно. Рабочий паук:

import json
import re

import scrapy   

class OlxSpider(scrapy.Spider):
    name = "olx"
    rotate_user_agent = True
    allowed_domains = ["olx.pt"]
    start_urls = [
        "https://olx.pt/imoveis/"
    ]

    def parse(self, response):
        for href in response.css('.link.linkWithHash.detailsLink::attr(href)'):
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse_house_contents)

        for next_page in response.css('.pager .br3.brc8::attr(href)'):
            url = response.urljoin(next_page.extract())
            yield scrapy.Request(url, self.parse)

    def parse_house_contents(self, response):
        property_id = re.search(r"ID(\w+)\.", response.url).group(1)

        phone_url = "https://olx.pt/ajax/misc/contact/phone/%s/" % property_id
        yield scrapy.Request(phone_url, callback=self.parse_phone)

    def parse_phone(self, response):
        phone_number = json.loads(response.body)["value"]
        print(phone_number)

Если с этого «динамического» веб-сайта можно извлечь что-то еще, посмотрите, действительно ли Splash достаточно, а если нет, обратите внимание на автоматизацию браузера и selenium.

person alecxe    schedule 03.03.2016
comment
Мне действительно нужно, чтобы это работало, потому что я буду переходить на более сложные сайты js с календарями выбора даты и прочим. - person psychok7; 03.03.2016
comment
@psychok7, вы уверены, что для вашего сложного динамического веб-сайта будет достаточно scrapyjs? Возможно, переход на selenium ускорит и упростит работу.. - person alecxe; 03.03.2016
comment
Я пробую это.. Я понятия не имею, возможно это или нет.. Но я также посмотрю на селен, спасибо - person psychok7; 03.03.2016
comment
@psychok7 хорошо, добавил примечание о selenium к ответу. Извините, что не решил вашу конкретную проблему с Splash, но я лично решил бы это с помощью selenium.. ну, может быть, частично, потому что я лучше знаком с ним, чем со Splash, но у меня сложилось впечатление, что Splash не решит универсально проблемы с динамикой, поскольку настоящий браузер будет... просто мысль... - person alecxe; 04.03.2016
comment
я принял ваш ответ, так как увидел, что селен намного более зрелый, но у меня возникли некоторые проблемы, может быть, вы могли бы мне помочь? вот мой вопрос stackoverflow.com/questions/35799855/scrapy-selenium-datepicker - person psychok7; 04.03.2016

Добавлять

splash:autoload("https://code.jquery.com/jquery-2.1.3.min.js")

на сценарий Lua, и он будет работать.

function main(splash)
    splash:go(splash.args.url)
    splash:autoload("https://code.jquery.com/jquery-2.1.3.min.js")
    splash:runjs('document.getElementById("contact_methods").getElementsByTagName("span")[1].click();')
    splash:wait(0.5)
    return splash:html()
end

.click() — это функция JQuery https://api.jquery.com/click/

person marvin    schedule 05.03.2016