#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)
vsurl = "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)