Как эта веб-страница блокирует меня, когда я просматриваю цикл, но не когда я обращаюсь к нему напрямую?

#python #web-scraping

#python #очистка веб-страницы

Вопрос:

Я пытаюсь очистить набор веб-страниц. Когда я просматриваю одну веб-страницу напрямую, я могу получить доступ к html. Однако, когда я перебираю фрейм данных pd, чтобы очистить набор веб-страниц, даже фрейм данных, содержащий только одну строку, я вижу усеченный html и не могу извлечь нужные данные.

Перебор фрейма данных из 1 строки:

 import pandas as pd
from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests
import re

first_names = pd.Series(['Robert'], index = [0])
last_names = pd.Series(['McCoy'], index = [0])
names = pd.DataFrame(columns = ['first_name', 'last_name'])
names['first_name'] = first_names
names['last_name'] = last_names

freq = []

for first_name, last_name in names.iterrows():
    url = "https://zbmath.org/authors/?q={} {}".format(first_name, 
    last_name)
    r = requests.get(url)
    html = BeautifulSoup(r.text)
    html=str(html)
    frequency = re.findall('JointsPublications">(.*?)</a>', html)
    freq.append(frequency)

print(freq)
  

[[]]

Прямой доступ к веб-странице. Тот же код, но теперь не заблокирован.

 url = "https://zbmath.org/authors/?q=robert mccoy"
r = requests.get(url)
html = BeautifulSoup(r.text)
html=str(html)
frequency = re.findall('JointsPublications">(.*?)</a>', html)
freq.append(frequency)

print(freq)
  

[[], [’10’, ‘8’, ‘6’, ‘5’, ‘3’, ‘3’, ‘2’, ‘2’, ‘2’, ‘2’, ‘2’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’]]

Как я могу выполнить цикл по нескольким веб-страницам, но не быть заблокированным?

Комментарии:

1. Прежде всего, вы, вероятно, нарушаете условия обслуживания сайта, очень быстро отправляя им кучу автоматических запросов. Во-вторых, они, вероятно, ограничивают скорость на основе своих фильтров DDOS. Способ обойти это — замедлить ваши запросы до разумного объема трафика, обычно используя time.sleep промежутки requests.get() между вызовами

2. Но почему сайт блокирует меня, когда я повторяю цикл длиной один? В моем коде выше я захожу на сайт только с одним запросом, и я все еще заблокирован. (Также я использовал time.sleep и я все еще заблокирован.)

3. Проверьте вывод itterrows . Это не дает вам значений столбцов, это дает вам кортежи (index, (columns)) , которые вам нужно проанализировать глубже

4. Хм. Я не думаю, что проблема в itterrows, потому что когда я запускаю iterrows и печатаю html, я все еще вижу правильный набор html, хотя и тот, в котором все мои нужные данные усечены.

5. Единственное различие между рабочим и нерабочим вызовами — это url = "https://zbmath.org/authors/?q={} {}".format(first_name, last_name) vs url = "https://zbmath.org/authors/?q=robert mccoy" , поэтому вы напечатали строку URL, чтобы убедиться, что это действительно одно и то же?

Ответ №1:

Iterrows возвращает кортеж (индекс, (столбцы)), поэтому решение состоит в том, чтобы проанализировать его немного по-другому:

 for _,(first_name, last_name) in names.iterrows():
    url = "https://zbmath.org/authors/?q={} {}".format(first_name, 
    last_name)
    r = requests.get(url)
    html = BeautifulSoup(r.text)
    html=str(html)
    frequency = re.findall('JointsPublications">(.*?)</a>', html)
    freq.append(frequency)

print(freq)