【发布时间】:2018-12-31 02:59:25
【问题描述】:
我有一个看起来像这样的蜘蛛:
import scrapy
from scrapy_splash import SplashRequest
class BarkbotSpider(scrapy.Spider):
name = 'barkbot'
start_urls = [
'http://www.facebook.com/pg/TheBarkFL/events/?ref=page_internal/'
]
custom_settings = {
'FEED_URI': 'output/barkoutput.json'
}
def start_requests(self):
for url in self.start_urls:
yield SplashRequest(
url,
self.parse,
)
def parse(self, response):
for href in response.css("div#upcoming_events_card a::attr(href)").extract():
yield response.follow(href, self.parse_concert)
def parse_concert(self, response):
concert = {
"headliner" : response.xpath(
"//h1[@id='seo_h1_tag']/text()"
).extract_first(),
"venue" : "The Bark",
"venue_address" : "507 All Saints St.",
"venue_website" : "https://www.facebook.com/TheBarkFL",
"date_time" : response.xpath(
"//li[@id='event_time_info']//text()"
).extract(),
"notes" : response.xpath(
"//div[@data-testid='event-permalink-details']/span/text()"
).extract()
}
if concert['headliner']:
yield concert
我运行蜘蛛并成功完成。但是所有“notes”和“date_time”键返回的是空列表。我对注释一感到特别困惑,因为这似乎相当简单,除非 xpath 不能使用 data-testid 作为属性。但是,我已成功抓取了标题键,因此显然我正在连接到每个页面。
我不熟悉抓取 JavaScript 生成的内容和 Splash,但我设法让另一只蜘蛛成功工作,只是在 Facebook 上没有。什么给了?
【问题讨论】:
-
Splash 是否允许您访问浏览器发出的网络请求?因为将事件数据从他们对 graphql 端点的 XHR 调用中提取出来会很棒,因为它是结构化数据
-
Facebook 上不允许抓取,所以不要那样做。你必须使用 api。
标签: python facebook scrapy splash-screen