2016-07-16 72 views
1

我試圖從this page刮取內容,請參閱下面的代碼。不過,我很好奇,就好像我反覆運行代碼一樣,即使瀏覽器中顯示的頁面是相同的,我仍然會得到不同的作業位置列表(以及評論)。 例如第一次迭代是正確的,但第二次使用相同的起始URL運行腳本,位置「大學村」和「遠程遠程工作」從列表中消失(和「聖薩爾瓦多」和「亞特蘭大」輸入,以便列表長度相同)。用Beautifulsoup刮 - 內容與顯示頁面不同

據我所知,沒有「隱藏」文本,即。所有這些應該是可見的(並且在第一次迭代中)。 發生了什麼事?我如何確保抓取所有內容(我需要重複幾千頁,因此我不想手動查看報廢的數據)。

This question是相關的,但我不認爲這是知識產權問題,在這裏,因爲我可以在第一次迭代中顯示的內容。

編輯補充:代碼居然跳過一些評論,即使那些被識別,就我所看到的,酷似代碼拿起的。

下面是代碼(簡化):

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,但是保持處理部分是基於美麗的?或者如果我使用ghost.py(再次保持代碼的主要部分不變),我會得到相同的結果嗎? 我是一個初學者,從頭到尾都是,嗯,恐嚇? :) –

+0

嗨anne_t,在我看來,將bs和casperjs一起使用的一般方法是使用單個進程(如Popen)在py中調用casperjs腳本,並使用bs處理由casperjs下載的html。此外,我編輯我的答案並將PhantomJS和bs鏈接在一起。我不知道ghost.py部分,我沒有處理它之前:) – linpingta

+0

謝謝!我一定會查找它! –