首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法找到web-scraping的网站API -没有找到json响应

无法找到web-scraping的网站API -没有找到json响应
EN

Stack Overflow用户
提问于 2020-07-16 10:23:30
回答 1查看 443关注 0票数 0

我正试图从这个网站上刮取委员会的税阶数据,但我找不到API:

https://ecitizen.aberdeencity.gov.uk/publicaccesslive/selfservice/services/counciltax/bandsearchresults.htm?action=pageNavigation&p=0

我已经浏览了以前关于堆栈溢出的答案和文章,包括:

代码语言:javascript
运行
复制
http://www.gregreda.com/2015/02/15/web-scraping-finding-the-api/

代码语言:javascript
运行
复制
https://medium.com/@williamyeny/finding-ratemyprofessors-private-api-with-chrome-developer-tools-bd6747dd228d

我已经进入了Network选项卡- XHR/All -Header/ Preview/ Response,唯一能找到的是:

代码语言:javascript
运行
复制
/**/jQuery11130005376436794664263_1594893863666({ "html" : "<li class='navbar-text myprofile_salutation'>Welcome Guest!</li><li role='presentation' class=''><a href='https://ecitizen.aberdeencity.gov.uk/publicaccesslive/selfservice/citizenportal/login.htm?redirect_url=https://ecitizen.aberdeencity.gov.uk/publicaccesslive/selfservice/dashboard.htm'> Sign In / Register <span class='icon-arrow-right17 pull-right visible-xs-block'></span></a></li>" });

作为一种测试,我使用AB24 4DE进行搜索,但在json响应中找不到它。

据我所知,数据并不隐藏在网络套接字后面。

我为了这件事做了一个get请求,然后得到:

代码语言:javascript
运行
复制
JSONDecodeError: Expecting value: line 10 column 1 (char 19)

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-16 11:11:06

你对网络工具的看法是正确的。我发现最好放大你在网络选项卡中给出的概览。您可以在浏览器中选择任意比例的操作。看看正在发生什么,什么请求是提出的。因此,当您单击“搜索”时,您可以专注于请求和响应的开始。它给出了两个请求,一个请求将信息发布到服务器,另一个请求将信息抓取到单独的url。

建议

我建议看过网站后,可能会使用selenium,这是一个模仿浏览器活动的包。下面你会看到我对这些请求的研究。实际上,表单为每次进行搜索时都会生成一个唯一的令牌。为了得到正确的响应,YOu必须进行复制。这一点很难事先知道。

尽管如此,您可以使用selenium模拟浏览器活动,并自动输入邮政编码和自动单击搜索按钮。然后,您可以获取页面源HTML,并使用漂亮的汤来解析它。下面是一个最小的可重现性示例,向您展示这一点。

编码示例

代码语言:javascript
运行
复制
from selenium import webdriver 
from bs4 import BeautifulSoup 
driver = webdriver.Chrome(executable_path=r'c:\users\aaron\chromedriver.exe')
url = 'https://ecitizen.aberdeencity.gov.uk/publicaccesslive/selfservice/services/counciltax/bandsearch.htm'                          
driver.get(url)
driver.find_element_by_id('postcode').send_keys('AB24 4DE')
driver.find_element_by_xpath('//input[@class="btn btn-primary cap-submit-inline"]').click()
soup = BeautifulSoup(driver.page_source,'html.parser')

还存在使浏览器无头的范围,因此它不会弹出,您将得到的只是解析的html。

对守则的解释

我们从selenium导入webdriver,这提供了加载浏览器所需的模块。然后我们创建一个webdriver实例,在本例中,我使用的是chrome,但您可以使用firefox或其他浏览器。

你需要从这里下载色度驱动器,https://chromedriver.chromium.org/。Webdriver使用它来打开浏览器。

我们使用方法使chromedriver转到我们想要的特定页面。

Webdriver有一个查找元素的列表.你可以用。这里最简单的是find_element_by_id。我们可以在HTML中找到输入框的id,以输入邮政编码,我在这里已经这样做了。Send_keys将发送我们想要的任何文本,在本例中是它的AB24 4DE。

find_element_by_xpath采用XPATH选择器。'//‘贯穿所有DOM,我们选择输入,@class=“部件”选择特定的输入标记类。我们要提交按钮。click()方法将单击该浏览器。

然后我们抓取页面源代码,一旦点击完成,这是必要的,因为我们然后输入到BeuatifulSoup,这将给我们分析的HTML的邮政编码,我们想要。

反向工程HTTP请求

下面是真正的教育,除非有人可以在发送请求到服务器之前得到唯一的令牌。以下是该网站在搜索表单方面的工作方式。

从本质上看,它是向服务器发送cookies、headers、params和数据。cookies的会话ID在我的测试中似乎没有变化。数据变量是您可以更改邮政编码的地方,但重要的是,每次您想要进行搜索时,ABCtoken都会发生变化,而param是服务器上的检查,以确保它不是机器人。

这里作为HTTP请求的一个例子。我们寄出这个

代码语言:javascript
运行
复制
cookies = {
    'JSESSIONID': '1DBAC40138879EB418C14AD83C05AD86',
}

headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'Upgrade-Insecure-Requests': '1',
    'Origin': 'https://ecitizen.aberdeencity.gov.uk',
    'Content-Type': 'application/x-www-form-urlencoded',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-User': '?1',
    'Sec-Fetch-Dest': 'document',
    'Referer': 'https://ecitizen.aberdeencity.gov.uk/publicaccesslive/selfservice/services/counciltax/bandsearch.htm',
    'Accept-Language': 'en-US,en;q=0.9',
}

params = (
            ('action', 'validateData'),
         )

data = {
  'postcode': 'AB24 2RX',
  'address': '',
  'startSearch': 'Search',
  'ABCToken': '35fbfd26-cb4b-4688-ac01-1e35bcb8f63d'
}

https://ecitizen.aberdeencity.gov.uk/publicaccesslive/selfservice/services/counciltax/bandsearch.htm

然后在这里使用相同的JSESSIONID和唯一的ABCtoken执行HTTP请求,以获取想要bandsearchresults.html的数据

代码语言:javascript
运行
复制
'https://ecitizen.aberdeencity.gov.uk/publicaccesslive/selfservice/services/counciltax/bandsearchresults.htm'

因此,它正在创建一个JSESSIONID,这对于我测试中的任何邮政编码似乎都是一样的。然后,当您使用相同的JSESSIONID并使用ABCtoken时,它将提供搜索结果URL,您将得到正确的数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62932598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档