R语言爬取加拿大黄页披萨店:read_html函数失效求助
问题描述
我正在用R开发爬虫,想要抓取加拿大黄页(例如分页链接https://www.yellowpages.ca/search/si/2/pizza/Canada)上披萨店的名称和地址。参考了Stack Overflow上的澳洲黄页示例代码,但运行极慢,排查后发现read_html无法正常工作。尝试用httr的GET(url)获取内容,但格式不符合后续处理要求。需要实现需求并输出如下格式的结果:
id name address 1 1 OJ's Steak & Pizza 9906B Franklin Ave, Fort McMurray, AB T9H 2K5 2 2 MJs Pizza & Grill 10012 Franklin Ave, Fort McMurray, AB T9H 2K6 3 3 Hu's Pizza & Donairs 10020 Franklin Ave, Fort McMurray, AB T9H 2K6 # sample results sample_results = structure(list(id = c(1, 2, 3), name = c("OJ's Steak & Pizza", "MJs Pizza & Grill", "Hu's Pizza & Donairs"), address = c("9906B Franklin Ave, Fort McMurray, AB T9H 2K5", "10012 Franklin Ave, Fort McMurray, AB T9H 2K6", "10020 Franklin Ave, Fort McMurray, AB T9H 2K6" )), class = "data.frame", row.names = c(NA, -3L))
解决方案
问题根源有两个:一是原代码的HTML选择器适配澳洲黄页,和加拿大黄页结构不匹配;二是加拿大黄页有反爬限制,直接调用read_html会被拦截。以下是适配的完整代码:
library(rvest) library(httr) library(dplyr) # 单页爬虫函数 scrape_yellowpages_ca <- function(page_url) { # 设置请求头模拟浏览器访问,规避反爬 headers <- add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" ) # 获取页面内容并解析为rvest可处理的HTML格式 response <- GET(page_url, headers) webpage <- content(response, as = "parsed", type = "text/html") # 提取店铺名称(对应加拿大黄页的CSS选择器) names <- webpage %>% html_nodes(".listing__name--link") %>% html_text(trim = TRUE) # 提取店铺地址 addresses <- webpage %>% html_nodes(".listing__address") %>% html_text(trim = TRUE) # 生成符合要求的数据框,加入id列 max_len <- max(length(names), length(addresses)) tibble( id = seq_len(max_len), name = ifelse(seq_len(max_len) <= length(names), names, NA), address = ifelse(seq_len(max_len) <= length(addresses), addresses, NA) ) } # 测试爬取指定分页 test_url <- "https://www.yellowpages.ca/search/si/2/pizza/Canada" result <- scrape_yellowpages_ca(test_url) # 查看结果 print(result) # 验证结构是否匹配需求 str(result)
关键说明
- 通过
add_headers设置浏览器标识,避免被反爬机制拦截; - 用
httr::GET获取内容后,通过content()直接解析为rvest兼容的HTML文档,解决格式适配问题; - 针对加拿大黄页的页面结构,使用了正确的CSS选择器:
.listing__name--link提取名称,.listing__address提取地址; - 加入了名称和地址数量不匹配的容错处理,防止爬虫中断。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

