BeautifulSoup неправильно анализирует HTML внутри Try / Except Loop - PullRequest
0 голосов
/ 26 октября 2019

У меня проблема с анализом документа в 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

1 Ответ

0 голосов
/ 31 октября 2019

Так как никто не взломал его, я подумал, что вернусь и обновлю решение - мое использование "X-Requested-With": "XMLHttpRequest" в моей переменной head является причиной ошибки. Я все еще новичок в программировании, особенно в создании HTTP-запросов, но я знаю, что это как-то связано с Ajax. В любом случае, когда я удалил этот бит из атрибута headers в моем запросе, BeautifulSoup полностью проанализировал документ.

Этот ответ , а также этот более подробно объясняет, что это общий подход к предотвращению подделки межсайтовых запросов, поэтому мой запрос былвсегда возвращается пустым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...