新年快乐!
刚开始学习 Julia 我为自己设定的第一个小挑战是从大量 URL 列表中抓取数据。
我在 CSV 文件中有大约 50k 个 URL(我使用 Julia 成功地从 JSON 中使用 Regex 解析了这些 URL)。我想抓取每个并返回一个匹配的字符串(“/page/12345/view” - 其中 12345 是任何整数)。
我设法使用 HTTP 和 Queryverse 做到了这一点(虽然是从 CSV 和 CSVFiles 开始的,但为了学习目的而查看包),但脚本似乎在不到 2k 后就停止了。我看不到诸如超时之类的错误。
我可以问是否有人可以建议我做错了什么或我如何以不同的方式处理它?学习资源的解释/链接也很棒!
using HTTP, Queryverse
URLs = load("urls.csv") |> DataFrame
patternid = r"\/page\/[0-9]+\/view"
touch("ids.txt")
f = open("ids.txt", "a")
for row in eachrow(URLs)
urlResponse = HTTP.get(row[:url])
if Int(urlResponse.status) == 404
continue
end
urlHTML = String(urlResponse.body)
urlIDmatch = match(patternid, urlHTML)
write(f, urlIDmatch.match, "\n")
end
close(f)
最佳答案
总有一个服务器可以检测到您的爬虫并故意花费很长时间来响应。
基本上,由于抓取是 IO 密集型操作,因此您应该使用大量异步任务来完成。此外,这应该与 readtimeout
结合使用get
的参数功能。因此,您的代码或多或少会像这样:
asyncmap(1:nrow(URLs);ntasks=50) do n
row = URLs[n, :]
urlResponse = HTTP.get(row[:url], readtimeout=10)
# the rest of your code comes here
end
即使某些服务器延迟传输,总是有许多连接在工作。
关于web-scraping - 使用 Julia 从大量 URL 中抓取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65530350/