Скребок с Beautifulsoup - содержимое, отличное от отображаемой страницы

61
4

Я пытаюсь очистить содержимое с этой страницы, см. Код ниже. Мне любопытно, однако, как будто я запускаю код повторно, я продолжаю получать другой список мест работы (и, следовательно, обзоры), хотя отображаемая страница в моем браузере такая же. Например, первая итерация верна, но второй раз запускается сценарий с тем же стартовым URL-адресом, из списка списываются местоположения "Университетская деревня" и "Удаленная телеработа" (и "Сан-Сальвадор" и "Атланта", так что список имеет одинаковую длину).

Насколько я вижу, нет "скрытого" текста, т.е. все они должны быть видны (и находятся на первой итерации). Что происходит? Как я могу получить все содержимое (мне нужно повторить несколько тысяч страниц, поэтому я не хочу вручную перебирать данные).

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

Отредактировано для добавления: код действительно пропускает некоторые обзоры, даже если они идентифицированы, насколько я могу видеть, точно так же, как те, которые получает код.

Вот код (упрощенный):

list_url= ["http://www.indeed.com/cmp/Microsoft/reviews?fcountry=ALL"]

for url in list_url:
base_url_parts = urllib.parse.urlparse(url)
while True:
raw_html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(raw_html,"lxml")

review_tag={'class':re.compile("cmp-review-container")}
reviews=soup.find_all(attrs=review_tag)

job_locations=[]

for r in reviews:
if r.find(attrs={'class':"cmp-reviewer-job-location"}) != None:
job_location=r.find(attrs={'class':"cmp-reviewer-job-location"}).get_text().strip().encode('utf-8')
else:
job_location = "."
job_locations.append(job_location)

#Zip the data and write the observations to the CSV file

try:
last_link = soup.find('div', id='company_reviews_pagination').find_all('a')[-1]
if last_link.text.startswith('Next'):
next_url_parts = urllib.parse.urlparse(last_link['href'])
url = urllib.parse.urlunparse((base_url_parts.scheme, base_url_parts.netloc,
next_url_parts.path, next_url_parts.params, next_url_parts.query,
next_url_parts.fragment))
print(url)
else:
break
except:
break

csvfile.close()

PS. Извините, если это не подходящее место для размещения этого вопроса; сообщите мне о более подходящем месте в этом случае.

спросил(а) 2021-01-19T20:07:31+03:00 2 месяца, 3 недели назад
1
Решение
62

На мой взгляд, это связано с запросом Ajax в вашем целевом URL, я мог бы найти некоторые запросы типа XHR, когда я его посещаю.

Для связанного с Ajax веб-сайта: "То, что пользователь видит, что видит искатель", совсем другое. urllib или запросы будут посещать данные только в первый раз при загрузке страницы, в то время как некоторое содержимое может быть потеряно здесь.

Если вы хотите сканировать веб-сайт с помощью запроса Ajax, я рекомендую использовать CasperJS, который основан на PhantomJS, он издевается над тем, что люди посещают на веб-сайте, и будет ждать, пока все данные, которые вам понадобятся для дальнейшей работы, также связаны с python, пожалуйста, проверьте здесь :)

====== UPDATE ======

Я добавляю еще одну ссылку соскабливания с помощью python-selenium-and-phantomjs, связанную с phantomjs и beautifulsoup вместе, и может быть полезна для некоторых случаев.

ответил(а) 2021-01-19T20:07:31+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема