Scrapy爬虫以递归方式解析数据无法回调

时间:2019-01-18 19:21:00

标签: python scrapy

我是新手,我用python scrapy编写了一个脚本以递归获取信息。

首先,它会刮擦城市的链接(包括旅游信息),然后追踪每个城市并到达其页面。接下来,在转到下一页之前,它会获取与城市有关的旅行所需的信息,依此类推。分页在没有可见链接的Java脚本上运行。

我用来获取结果以及csv输出的命令是:

scrapy crawl pratice -o practice.csv -t csv

预期结果是csv文件:

title, city, price, tour_url
t1, c1, p1, url_1
t2, c2, p2, url_2
...

问题是csv文件为空。运行在“ parse_page”处停止,并且callback =“ self.parse_item”不起作用。我不知道该如何解决。也许我的工作流程无效或我的代码有问题。感谢您的帮助。

name = 'practice'
start_urls = ['https://www.klook.com/vi/search?query=VI%E1%BB%86T%20NAM%20&type=country',]

def parse(self, response): # Extract cities from country
    hxs = HtmlXPathSelector(response)
    urls = hxs.select("//div[@class='swiper-wrapper cityData']/a/@href").extract()
    for url in urls:
        url = urllib.parse.urljoin(response.url, url)
        self.log('Found city url: %s' % url)
        yield response.follow(url, callback=self.parse_page) # Link to city


def parse_page(self, response): # Move to next page
    url_ = response.request.url
    yield response.follow(url_, callback=self.parse_item)

    # I will use selenium to move next page because of next button is running
    # on javascript without fixed url.

def parse_item(self, response): # Extract tours
    for block in response.xpath("//div[@class='m_justify_list m_radius_box act_card act_card_lg a_sd_move j_activity_item js-item ']"):
        article = {}
        article['title'] = block.xpath('.//h3[@class="title"]/text()').extract()
        article['city'] = response.xpath(".//div[@class='g_v_c_mid t_mid']/h1/text()").extract()# fixed
        article['price'] = re.sub("  +","",block.xpath(".//span[@class='latest_price']/b/text()").extract_first()).strip()
        article['tour_url'] = 'www.klook.com'+block.xpath(".//a/@href").extract_first()

        yield article

2 个答案:

答案 0 :(得分:0)

hxs = HtmlXPathSelector(response)    #response is already in Selector, use direct `response.xpath`

url = urllib.parse.urljoin(response.url, url)

用作:

url = response.urljoin(url)

是,它将停止,因为其重复请求。网址,您需要添加dont_filter=True检查

答案 1 :(得分:0)

而不是使用Selenium,而是找出网站使用JavaScript所执行的请求(在浏览时观看浏览器开发人员工具的“网络”标签)并重现类似的请求。

网站使用底层的JSON请求来获取商品,比HTML解析起来容易得多。

此外,如果您不熟悉Scrapy的异步特性,则在将其与Selenium结合使用时可能会遇到意想不到的问题。

诸如Splash或Selenium之类的解决方案只能在其他所有方法均失败时用作最后的资源。