我已经创建了一个脚本,使用请求模块和BeautifulSoup库从网页中获取一些表格内容。要生成表,必须手动执行我在所附图像中显示的步骤。我在下面粘贴的代码可以正常工作,但我试图解决的主要问题是以编程方式获取title
编号,在本例中,它是628086906
,附加到我在这里硬编码的table_link
上
在第6步中单击工具按钮后,当您将光标悬停在地图上时,您可以看到此选项Multiple
,当您单击此选项时,它将引导您找到包含标题号的url
这正是脚本所遵循的the steps
这是linc编号0030278592
,需要在步骤6的输入框中输入
我尝试过(在table_link
中使用硬编码的标题号时使用了一个):
import requests
from bs4 import BeautifulSoup
link = 'https://alta.registries.gov.ab.ca/spinii/logon.aspx'
lnotice = 'https://alta.registries.gov.ab.ca/spinii/legalnotice.aspx'
search_page = 'https://alta.registries.gov.ab.ca/SpinII/SearchSelectType.aspx'
map_page = 'http://alta.registries.gov.ab.ca/SpinII/mapindex.aspx'
map_find = 'http://alta.registries.gov.ab.ca/SpinII/mapfinds.aspx'
table_link = 'https://alta.registries.gov.ab.ca/SpinII/popupTitleSearch.aspx?title=628086906'
def get_content(s,link):
r = s.get(link)
soup = BeautifulSoup(r.text,"lxml")
payload = {i['name']:i.get('value','') for i in soup.select('input[name]')}
payload['uctrlLogon:cmdLogonGuest.x'] = '80'
payload['uctrlLogon:cmdLogonGuest.y'] = '20'
r = s.post(link,data=payload)
soup = BeautifulSoup(r.text,"lxml")
payload = {i['name']:i.get('value','') for i in soup.select('input[name]')}
payload['cmdYES.x'] = '52'
payload['cmdYES.y'] = '8'
s.post(lnotice,data=payload)
s.headers['Referer'] = 'https://alta.registries.gov.ab.ca/spinii/welcomeguest.aspx'
s.get(search_page)
s.headers['Referer'] = 'https://alta.registries.gov.ab.ca/SpinII/SearchSelectType.aspx'
s.get(map_page)
r = s.get(map_find)
s.headers['Referer'] = 'http://alta.registries.gov.ab.ca/SpinII/mapfinds.aspx'
soup = BeautifulSoup(r.text,"lxml")
payload = {i['name']:i.get('value','') for i in soup.select('input[name]')}
payload['__EVENTTARGET'] = 'Finds$lstFindTypes'
payload['Finds:lstFindTypes'] = 'Linc'
payload['Finds:ctlLincNumber:txtLincNumber'] = '0030278592'
r = s.post(map_find,data=payload)
r = s.get(table_link)
print(r.text)
if __name__ == "__main__":
with requests.Session() as s:
s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
get_content(s,link)
How can I grab the title number from the url?
或
How can I fetch all the linc numbers from that site so that I don't need to use map at all?
The only problem with this site is that it is unavailable in daytime for maintenance.
有两个选项可以获取您正在寻找的信息,其中一个是您可能已经知道的selenium
打开“网络”选项卡,并在您将鼠标悬停在地图上时监视浏览器正在传递的请求(无论是否向服务器发出请求)。对于请求和BS4,您最好的选择是,如果已经加载了数据,则下面的解决方案可能无法工作
如果它打印出数字,则意味着数据以json格式提供,并通过页面加载,您可以加载json或使用正则表达式查找。否则,您唯一的选择就是硒
从以下位置调用数据:
内容在被OpenLayers library使用之前以自定义格式编码。所有解码都位于this JS file。如果你美化它,你可以寻找解码它的
WayTo.Wtb.Format.WTB
的OpenLayers.Class
。二进制文件按字节进行解码,如下所示:为了得到原始数据,我们必须复制这种解码算法。我们不需要解码所有的对象,我们只想得到正确的偏移量并正确地提取
strings
。以下是用于解码部分的python脚本,该解码部分解码来自文件的数据(输出curl):(旁注:注意元素大小以大端为单位,所有其他值以小端为单位)
运行this repl.it查看它如何解码文件
在此基础上,我们构建了获取数据的步骤,为了清晰起见,我将描述所有步骤(即使是您已经了解的步骤):
登录
使用以下方式登录网站:
刮取输入名称/值并添加
uctrlLogon:cmdLogonGuest.x
和uctrlLogon:cmdLogonGuest.y
,然后调用法律公告
获取地图值不需要法律通知,但获取项目信息需要法律通知(文章的最后一步)
刮取
input
标记名称/值,设置cmdYES.x
和cmdYES.y
,然后调用地图数据
调用服务器映射API:
使用以下数据:
cx
/xy
是画布大小使用上述方法对编码数据进行解码。您将获得:
提取信息
如果您想针对一个特定的
lincNumber
,您需要查找多边形的样式,因为对于“多个”值(例如具有多个项目的值),响应中没有提到lincNumber
id,只是一个链接引用。以下内容将获取所选项目:调用您在帖子中提到的url以获取数据并提取表格:
完整代码:
Run this on repl.it
输出
如果您想获得更多条目,可以查看
objects
字段。如果你想获得更多关于物品的信息,比如坐标等,你可以改进解码器也可以通过查看包含lincNumber的
name
字段来匹配目标周围的其他lincNumber,除非其中有“多个”名称有趣的事实:
相关问题 更多 >
编程相关推荐