我创建了一个基本程序,尝试使用BeautifulSoup 4
抓取我的外部IP地址的网站。虽然,我不断为我的程序获取属性错误,因为它无法获取div类的字符串或其他任何内容。它会显示为特定的div类不存在,因此它不能抓取它。我知道它存在的事实,即使它说不存在。有谁知道出了什么问题?
这是我的代码:
import requests, sys, io
from html.parser import HTMLParser
from bs4 import BeautifulSoup
url = "https://www.iplocation.net/find-ip-address"
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, "cp437", "backslashreplace")
sourcecode = requests.get(url)
plaintext = sourcecode.text
soup = BeautifulSoup(plaintext, "html.parser")
tag = soup.find("span", {"style": "font-weight: bold; color:green;"})
print(tag)
ip = tag.string
print(ip)
答案 0 :(得分:2)
它与Javascript无关,如果你查看返回的源代码,你可以看到:
<html style="height:100%"><head><META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"><meta name="format-detection" content="telephone=no"><meta name="viewport" content="initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"></head><body style="margin:0px;height:100%"><iframe src="/_Incapsula_Resource?CWUDNSAI=24&xinfo=9-52943897-0 0NNN RT(1471643127529 69) q(0 -1 -1 -1) r(0 -1) B12(8,881022,0) U10000&incident_id=198001480102412051-472966643371608393&edet=12&cinfo=08000000" frameborder=0 width="100%" height="100%" marginheight="0px" marginwidth="0px">Request unsuccessful. Incapsula incident ID: 198001480102412051-472966643371608393</iframe></body></html>
他们发现你是一个机器人,并没有给你你期望的来源。
您可以使用json格式的 wtfismyip.com 获取您的IP和更多信息:
url = "http://wtfismyip.com/json"
js = requests.get(url).json()
print(js)
或者只使用 httpbin :
进行ipurl = "http://httpbin.org/ip"
js = requests.get(url).json()
print(js)
答案 1 :(得分:1)
如上所述,在服务器上放置了机器人检测机制,如果您尝试执行请求,则返回“请求失败.Incapsula事件ID:415000500153648966-193432437842182947”,因为未加载源代码,您无法找到所需信息。 如果你想与beautifulsoup一起做,在selenium和beautifulsoup的帮助下你可以得到它,这里是示例代码:
如果没有安装selenium,请先“pip install selenium”并从“https://sites.google.com/a/chromium.org/chromedriver/downloads”下载chromedriver
from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Chrome("**Path to chrome driver**\chromedriver.exe")
driver.get('https://www.iplocation.net/find-ip-address')
content = driver.page_source.encode('utf-8').strip()
soup = BeautifulSoup(content,"html.parser")
tag = soup.find("span", {"style": "font-weight: bold; color:green;"}).text
print(tag)
将打印:xxx.xx.xxx.xxx
注意:有些时候第一次在新机器上启动脚本时,它可能会要求验证码,手动输入,然后脚本就可以了