[英]Scraping with Beautifulsoup - contents different from displayed page
我試圖從這個頁面抓取內容,請參閱下面的代碼。 我很好奇,好像我重復運行代碼,我不斷得到一個不同的工作位置列表(因此,評論),即使我瀏覽器中顯示的頁面是相同的。 例如,第一次迭代是正確的,但是第二次使用相同的起始URL運行腳本,位置“大學村”和“遠程遠程工作”從列表中消失(並且“San Salvador”和“Atlanta”進入,以便列表長度相同)。
據我所見,沒有“隱藏”的文字,即。 所有這些應該是可見的(並且在第一次迭代中)。 到底是怎么回事? 我怎樣才能確保抓住所有內容(我需要重復幾千頁,所以我不想手動完成報廢數據)。
這個問題是相關的,但我不認為這是一個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。 對不起,如果這不是發布此問題的正確位置; 讓我知道在這種情況下更合適的地方。
在我看來,它與你的目標url中的 Ajax請求有關,我可以在訪問它時找到一些XHR類型的請求。
對於Ajax相關網站, “用戶看到的內容,爬蟲看到的內容”是完全不同的。 urllib或者請求只會在第一次加載頁面時訪問數據,而某些內容可能會丟失。
如果你想用Ajax請求抓取一個網站,我建議使用基於PhantomJS的 CasperJS ,它嘲笑人們訪問網站的內容,並等到你需要加載的所有數據做進一步的工作,它也與python有關,請點擊這里 :)
======更新======
我添加另一個鏈接scraping-with-python-selenium-and-phantomjs ,它與phantomjs和beautifulsoup一起相關,並且可能對某些情況有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.