2016-03-03 17 views
5

tôi đang sử dụng Splash 2.0.2 + Scrapy 1.0.5 + Scrapyjs 0.1.1 và im vẫn không thể hiển thị javascript bằng một lần nhấp. Dưới đây là một ví dụ url https://olx.pt/anuncio/loja-nova-com-250m2-garagem-em-box-fechada-para-arrumos-IDyTzAT.html#c49d3d94cfScrapy + Splash + ScrapyJS

tôi vẫn nhận được những trang mà không có số điện thoại hiển thị:

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() 

làm thế nào tôi có thể có được điều này để làm việc?

Trả lời

2

Bạn có thể tránh phải sử dụng số Splash ngay từ đầu và thực hiện yêu cầu GET thích hợp để tự mình lấy số điện thoại. nhện làm việc:

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) 

Nếu có nhiều điều cần trích xuất từ ​​trang web "năng động" này, xem nếu Splash thực sự là đủ, và nếu không, nhìn vào tự động trình duyệt và selenium.

+0

Tôi thực sự cần làm việc này bởi vì tôi sẽ được di chuyển đến các trang web js phức tạp hơn với lịch bảng chọn ngày và các công cụ – psychok7

+1

@ psychok7 bạn có chắc scrapyjs sẽ đủ cho trang web động phức tạp của bạn? Có lẽ việc chuyển sang 'selenium' sẽ khiến mọi thứ trở nên nhanh hơn và đơn giản hơn .. – alecxe

+0

Tôi đang thử nó .. Tôi không biết liệu nó có khả thi hay không .. Nhưng tôi sẽ xem xét selenium cũng nhờ – psychok7

3

Thêm

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

để Lua kịch bản và nó sẽ làm việc.

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() là JQuery chức năng https://api.jquery.com/click/