【问题标题】:Cannot scrape website any longer with httr and rvest无法再使用 httr 和 rvest 抓取网站
【发布时间】:2021-11-29 13:59:08
【问题描述】:

自从 5 年前用户 hrbrmstr 回答了我的 this question 以来,我一直在成功地从该网站上抓取一张表格。最近网站发生了一些变化,我无法再获取数据。

URL <- "http://www.fiskistofa.is/veidar/aflaupplysingar/landanir-eftir-hofnum/"
library(httr)
library(rvest)
res <- POST(url = URL,
        query = list(lang="is"),
        body = list(magn = "Sundurlidun",
                    hofn = "87",
                    dagurFra = format(lubridate::today()-4, "%d.%m.%Y"),
                    dagurTil = format(lubridate::today(), "%d.%m.%Y"),
                    hnappur = "Sækja"),
        encode = "form")
doc <- content(res, as="parsed")

这就是我以前能够找到并提取表格的方式,但现在输出为空:

  html_nodes(doc, xpath=".//table[contains(., 'Magn')]") %>%
    html_table(header=TRUE) 

网站的外观没有任何改变,但最近他们为这个数据库打开了这个Power BI(表格在第 3 页),所以他们可能同时改变了一些我不知道的东西.

有什么建议吗?

【问题讨论】:

  • hofn = "87" 代表什么?当我在我的开发工具中查看它时,它看起来是hofn = "75"
  • 它是可以选择的众多港口之一。
  • lubridate::today() 以什么形式/格式给出?是"DD.MM.YYYY"吗?
  • 不确定在 R 中使用有什么问题。它在我的 Python 环境中运行良好。我唯一能想到的是,有时您需要在标题中包含user-agent,例如user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36。但不确定使用 R 执行此操作的语法
  • 好的,这可能是问题所在。它可能需要采用"DD.MM.YYYY" 的特定形式。因为如果我在 python 中尝试这种方式,其他形式将不起作用

标签: r web-scraping


【解决方案1】:

尝试将日期格式更改为'%d.%m.%Y'。并尝试将http:// 更改为https://

URL <- "https://www.fiskistofa.is/veidar/aflaupplysingar/landanir-eftir-hofnum/"
library(httr)
library(rvest)
res <- POST(url = URL,
        query = list(lang="is"),
        body = list(magn = "Sundurlidun",
                    hofn = "87",
                    dagurFra = format(lubridate::today()-4, '%d.%m.%Y') ,
                    dagurTil = format(lubridate::today(), '%d.%m.%Y'),
                    hnappur = "Sækja"),
        encode = "form")
doc <- content(res, as="parsed")

在 Python 中:

import requests
import pandas as pd
from datetime import datetime, timedelta

url = "https://www.fiskistofa.is/veidar/aflaupplysingar/landanir-eftir-hofnum/"
today = datetime.now()    
payload = {
    'magn' : "Sundurlidun",
    'hofn' : "87",
    'dagurFra' : (today - timedelta(days=4)).strftime("%d.%m.%Y"),
    'dagurTil' : today.strftime("%d.%m.%Y"),
    'hnappur' : "Sækja"}

df = pd.read_html(requests.post(url, data=payload).text)[-1]

输出:

print(df)
              0        1  ...                        4      5
0   Löndun dags  Skipnr.  ...               Vörutegund   Magn
1    25.11.2021     2999  ...      Steinbítur /slægður      5
2    25.11.2021     2999  ...      ÝSA/ÓSL./VS (HAFRO)    690
3    25.11.2021     2999  ...              Ýsa /óslægð    415
4    25.11.2021     2999  ...  ÞORSKUR/ÓSL./VS (HAFRO)    861
5    25.11.2021     2999  ...       Þorskur / óslægður  4.870
6    26.11.2021     2615  ...      ÝSA/ÓSL./VS (HAFRO)     14
7    26.11.2021     2615  ...              Ýsa /óslægð  1.005
8    26.11.2021     2615  ...  ÞORSKUR/ÓSL./VS (HAFRO)    164
9    26.11.2021     2615  ...       Þorskur / óslægður  1.507
10   27.11.2021     2842  ...  ÞORSKUR/ÓSL./VS (HAFRO)    271
11   27.11.2021     2842  ...       Þorskur / óslægður  5.703
12   27.11.2021     2842  ...     Þorskur-undirmál/ósl    151
13   27.11.2021     2842  ...          Hlýri /óslægður     13
14   27.11.2021     2842  ...                Gullkarfi     27
15   27.11.2021     2842  ...           Ufsi /óslægður     29
16   27.11.2021     2842  ...            Keila /óslægð     11
17   27.11.2021     2842  ...             Lýsa /óslægð      2
18   27.11.2021     2842  ...              Ýsa /óslægð  3.072
19   27.11.2021     2842  ...      Ýsa-undirmál/óslægð      8
20   28.11.2021     2256  ...              Ýsa /óslægð  1.888
21   28.11.2021     2256  ...     Þorskur-undirmál/ósl    551
22   28.11.2021     2256  ...       Þorskur / óslægður  4.212
23   28.11.2021     2256  ...      Steinbítur /slægður      4
24   28.11.2021     2256  ...      ÝSA/ÓSL./VS (HAFRO)    243
25   28.11.2021     2615  ...              Ýsa /óslægð    829
26   28.11.2021     2615  ...       Þorskur / óslægður  2.659
27   28.11.2021     2615  ...                Gullkarfi     34
28   28.11.2021     2842  ...            Keila /óslægð     11
29   28.11.2021     2842  ...                Gullkarfi     18
30   28.11.2021     2842  ...  ÞORSKUR/ÓSL./VS (HAFRO)     95
31   28.11.2021     2842  ...          Hlýri /óslægður     17
32   28.11.2021     2842  ...     Þorskur-undirmál/ósl     79
33   28.11.2021     2842  ...            Langa /óslægð     18
34   29.11.2021     1136  ...              Tindabikkja    599
35   29.11.2021     1136  ...               Þorsklifur  1.787

[36 rows x 6 columns]

【讨论】:

  • 能分享一下python代码吗?
  • 我编辑了问题中的日期格式,但这并没有解决我的问题。
  • 哦,你试过https://www.fiskistofa.is/veidar/aflaupplysingar/landanir-eftir-hofnum/而不是http://www.fiskistofa.is/veidar/aflaupplysingar/landanir-eftir-hofnum/吗?
  • 网址的变化一直是问题所在。问题解决了。
猜你喜欢
  • 2021-05-22
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 2017-03-22
  • 2020-07-18
  • 2019-02-17
相关资源
最近更新 更多