urllib.request.urlopen,未返回特定内容

时间:2017-11-01 21:49:20

标签: python python-3.x urllib

通过此请求,我返回页面源,但IP地址/主机名/位置字段为空。为什么,我怎么能得到这些?

import urllib.request
s = urllib.request.urlopen("http://www.whatsmyipaddress.net").read()
txt = str(s)
fs = open('myip-net.htm', 'w')
fs.write(txt)
fs.close()

2 个答案:

答案 0 :(得分:0)

whatsmyipaddress.net 使用JavaScript检索IP地址/主机名/位置字段。 JavaScript仅在您通过Web浏览器导航到页面时执行。您正在抓取HTML文件本身并将其内容写入另一个不执行JS的文件。此外,如果没有HTML链接到的CSS和JS文件的副本,该HTML文件将无法在本地计算机上正确加载。

如果您只关心获取IP和位置数据,我建议您从公共API请求数据。

例如: http://ip-api.com/json

答案 1 :(得分:0)

也许尝试选择selenium:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.whatsmyipaddress.net")
ip = driver.find_element_by_css_selector('p').text

返回:

'12.23.34.45' # the ip

首次尝试使用BeautifulSoup并提取内容时,我总是遇到此问题。我认为@Daniel Wasilewski是对的。他的回答很好。

注意:你还需要chromedriver.exe来做这样的工作。你不必使用Chrome; Firefox也可以运行。

<强>更新

我意识到这不是一个理想的答案,但除非你知道另一种处理javascript的方法,否则这只是&#34;单向&#34;可能是其他人。

Selenium有一个无头的&#34;选项,但它仍然打开看起来像命令窗口(在Windows上)。它被称为 phantomjs 。我不会详细描述有关它的所有内容; SO上有很多信息。

from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get("http://www.whatsmyipaddress.net")
ip = driver.find_element_by_css_selector('p').text
print(ip)