2016-07-16 2 views
1

Я пытаюсь очистить содержимое от this page, см. Код ниже. Мне любопытно, однако, как будто я запускаю код повторно, я продолжаю получать другой список мест работы (и, следовательно, обзоры), хотя отображаемая страница в моем браузере такая же. . Первая итерация правильная, но второй раз запускается сценарий с тем же стартовым URL-адресом, из списка выходят местоположения «University Village» и «Remote Telework» (и «San Salvador» и «Atlanta», так что список имеет одинаковую длину).Скребок с Beautifulsoup - содержимое отличается от отображаемой страницы

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

This question связан, но я не думаю, что это проблема 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. Извините, если это не подходящее место для размещения этого вопроса; сообщите мне о более подходящем месте в этом случае.

ответ

0

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

Для сайта, связанного с Ajax, "What the user sees, what the crawler sees" совсем иная. urllib или запросы будут посещать данные только в первый раз при загрузке страницы, в то время как некоторое содержимое может быть потеряно здесь.

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

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

добавить другую ссылку scraping-with-python-selenium-and-phantomjs, это связано с phantomjs и BeautifulSoup вместе, и может быть полезно для некоторых случаев.

+0

Спасибо. Есть ли способ использовать CasperJS для открытия и чтения URL-адреса, но сохранить обработку на основе beautifulsoup? Или я получу те же самые результаты, если бы я использовал ghost.py (снова сохраняя основную часть кода без изменений)? Я начинаю и начинаю все, ммм, запугиваю? :) –

+0

Hi anne_t, на мой взгляд, общий способ использования bs и casperjs вместе - использовать один процесс (например, Popen) для вызова сценария casperjs внутри вашей py и использовать bs для обработки html, загружаемого casperjs. Кроме того, я редактирую свой ответ и включаю ссылку с PhantomJS и bs вместе. Я не уверен в части ghost.py, я не занимался этим раньше :) – linpingta

+0

Спасибо! Я обязательно посмотрю! –

Смежные вопросы