Почему один и тот же метод запроса имеет разные структуры ответа HTML? - PullRequest
0 голосов
/ 15 января 2019

python3.6 + win10

Когда я очищал страницу с подробными данными, например https://ipinfo.io/AS... от https://ipinfo.io/countries/us, я получал другой результат из модуля запросов, иногда ресурс страницы не был завершен.

Как показано ниже, я привожу два примера:

import requests
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
}

(1) страница запроса https://ipinfo.io/AS13489 (полная)

complete_result = requests.get('https://ipinfo.io/AS13489', headers=headers)
print(complete_result.text)

Результат получить полную HTML-страницу:

<!DOCTYPE html>
<html>
<head>

...    

</body>

</html>

(2) страница запроса https://ipinfo.io/AS7018 (не полная)

not_complete_result = requests.get('https://ipinfo.io/AS7018', headers=headers)
print(not_complete_result.text)

Результат просто получить не полную HTML-страницу:


 </tr>

    <tr class="hidden">
...     
</body>

</html>

(3), кроме selenium, не работало и в моих попытках:

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://ipinfo.io/AS7018')
browser.implicitly_wait(5)

print(browser.page_source)

Результат не завершен

            256

        </td>

    </tr>

    <tr class="hidden">  

...

</iframe>
</html>

Обновите мои необходимые данные, теперь я путаюсь с тем, что иногда эти данные деталей исчезают.

enter image description here

Отсутствует часть содержимого HTML:

enter image description here


обновить мои коды:


import re
import requests

headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
}

# s = requests.get('https://ipinfo.io/AS7018', headers=headers).text
# not work , s get a not complete html cntent.

s = requests.get('https://ipinfo.io/AS13489', headers=headers).text

asn_code, name = re.search(r'<h3 class="font-semibold m-0 t-xs-24">(?P<ASN_CODE>AS\d+) (?P<NAME>[\w.\s]+)</h3>',s).groups()

country = re.search(r'.*href="/countries.*">(?P<COUNTRY>.*)?</a>',s).group("COUNTRY")

registry = re.search(r'Registry.*?pb-md-1">(?P<REGISTRY>.*?)</p>',s, re.S).group("REGISTRY").strip()

ip = re.search(r'IP Addresses.*?pb-md-1">(?P<IP>.*?)</p>',s, re.S).group("IP").strip()


print(asn_code, name, country, registry, ip)
# AS13489 EPM Telecomunicaciones S.A. E.S.P. Colombia lacnic 3,137,536

1 Ответ

0 голосов
/ 15 января 2019

Вы можете получить необходимые данные, как показано ниже:

import requests
from lxml import html

headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
}
not_complete_result = requests.get('https://ipinfo.io/AS7018', headers=headers)
source = html.fromstring(not_complete_result.text)

print(source.xpath('//div[contains(@class, "card-header")]/h3/text()[1]')[0])
#  'AS7018 AT&T Services, Inc.'
for item in source.xpath('(//div[contains(@class, "card-body")])[1]//div[contains(@class, "col-")]/p'):
    print(item.text_content().strip())
# att.com
# United States
# 1996-07-30
# arin
# 80,925,184
# isp
# There are 78,008 domain names hosted across 34,656 IP addresses on this ASN.
...