我正在尝试从this page抓取内容,请参阅下面的代码。我很好奇,好像我重复运行代码,我不断得到一个不同的工作位置列表(因此,评论),即使我浏览器中显示的页面是相同的。 例如。第一次迭代是正确的,但第二次使用相同的起始URL运行脚本,位置"大学村"和#34;远程远程工作"从列表中消失(" San Salvador"" Atlanta"输入,以便列表具有相同的长度)。
据我所见,没有"隐藏"文字,即。所有这些应该是可见的(并且在第一次迭代中)。 到底是怎么回事?我怎样才能确保获取所有内容(我需要重复几千页,所以我不想手动查看报废数据)。
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 :(得分:0)
在我看来,它与your target url中的Ajax请求有关,当我访问它时,我可以找到一些XHR类型的请求。
对于与Ajax相关的网站,"What the user sees, what the crawler sees"是完全不同的。 urllib或者请求只会在第一次加载页面时访问数据,而某些内容可能会丢失。
如果您想使用Ajax请求抓取网站,我建议使用基于CasperJS的PhantomJS,它会嘲笑人们访问网站的内容,并等待所有需要加载的数据要做进一步的工作,它也与python有关,请检查here:)
======更新======
我添加了另一个链接scraping-with-python-selenium-and-phantomjs,它与phantomjs和beautifulsoup有关,并且可能对某些情况有用。