У меня проблема с анализом документа в BS4, и я не уверен, что происходит. Код ответа в порядке, URL-адрес в порядке, прокси-серверы работают, все отлично, перетасовка прокси работает, как и ожидалось, но суп возвращается пустым, используя любой анализатор, кроме html5lib. Суп, который возвращается html5lib, останавливается на теге <body>
.
Я работаю в Colab, и мне удалось успешно запустить части этой функции в другом блокноте, и я смог пройтись по набору результатов поиска, сделать суп изссылки и захватить мои нужные данные, но мой целевой веб-сайт в конечном итоге блокирует меня, поэтому я переключился на использование прокси.
check(proxy)
- это вспомогательная функция, которая проверяет список прокси перед попыткой сделать запросмоего целевого сайта. Проблема, кажется, началась, когда я включил ее в try / исключением. Я предполагаю, что, возможно, это как-то связано с попыткой / за исключением включения в цикл for - idk.
Что меня смущает, так это то, что я знаю, что сайт вообще не блокирует скребки / роботы, так какЯ могу использовать BS4 в другом ноутбуке и получить то, что ищу.
from bs4 import BeautifulSoup as bs
from itertools import cycle
import time
from time import sleep
import requests
import random
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36', "X-Requested-With": "XMLHttpRequest"}
ips = []
proxy_pool = cycle(ips)
def scrape_boxrec():
search_result_pages = [num for num in range(0, 22700, 20)]
random.shuffle(search_result_pages)
for i in search_result_pages:
search_results_page_attempt.append(i)
proxy = next(proxy_pool)
proxies = {
'http': proxy,
'https': proxy
}
if check(proxy) == True:
url = 'https://boxrec.com/en/locations/people?l%5Brole%5D=proboxer&l%5Bdivision%5D=&l%5Bcountry%5D=&l%5Bregion%5D=&l%5Btown%5D=&l_go=&offset=' + str(i)
try:
results_source = requests.get(url, headers=head, timeout=5, proxies=proxies)
results_content = results_source.content
res_soup = bs(results_content, 'html.parser')
# WHY IS IT NOT PARSING THIS PAGE CORRECTLY!!!!
except Exception as ex:
print(ex)
else:
print("Bad Proxy. Moving On")
def check(proxy):
check_url = 'https://httpbin.org/ip'
check_proxies = {
'http': proxy,
'https': proxy
}
try:
response = requests.get(check_url, proxies=check_proxies, timeout=5)
if response.status_code == 200:
return True
except:
return False