问题描述
我是网络爬虫的新手,很少接触html文件系统,并且想知道是否有更好的更有效的方法来搜索网页的html版本上的所需内容。 目前,我想在这里对产品进行评论: ://www.walmart.com/ip/29701960?wmlspartner=wlpa&adid=2222222222702202200101&wl0=&wl1=g&wl2=c&wl3=34297254061&wl4=&wl5=pla&wl6=62272156621&veh=sem
为此,我有以下代码:
url = http://www.walmart.com/ip/29701960? wmlspartner=wlpa&adid=22222222227022069601&wl0=&wl1=g&wl2=c&wl3=34297254061&wl4=&wl5=pla&wl6=6227215 6621&veh=sem
review_url = url
#print review_url
#-------------------------------------------------------------------------
# Scrape the ratings
#-------------------------------------------------------------------------
page_no = 1
sum_total_reviews = 0
more = True
while (more):
#print "XXXX"
# Open the URL to get the review data
request = urllib2.Request(review_url)
try:
#print "XXXX"
page = urllib2.urlopen(request)
except urllib2.URLError, e:
#print "XXXXX"
if hasattr(e, 'reason'):
print 'Failed to reach url'
print 'Reason: ', e.reason
sys.exit()
elif hasattr(e, 'code'):
if e.code == 404:
print 'Error: ', e.code
sys.exit()
content = page.read()
#print content
soup = BeautifulSoup(content)
results = soup.find_all('span', {'class': re.compile(r's_star_\d_0')})
有了这个,我什么也看不懂。 我猜我必须给它一个准确的目的地。 有什么建议么 ?
1楼
使用AJAX调用加载评论。 您在提供的链接上找不到这些链接。 通过以下链接加载评论:
http://walmart.ugc.bazaarvoice.com/1336/29701960/reviews.djs?format=embeddedhtml&dir=desc&sort=relevancy
这样, 29701960
就可以从当前资源的html源中找到29701960
,如下所示:
<meta property="og:url" content="http://www.walmart.com/ip/29701960" />
+------+ this one
要么
trackProductId : '29701960',
+------+ or this one
1336
来自来源:
WALMART.BV.scriptPath = 'http://walmart.ugc.bazaarvoice.com/static/1336/';
+--+ here
使用这些值,构建上述URL并使用BeautifulSoup
从那里解析数据。
2楼
我知道问题最初是关于BeautifulSoup
,但是由于您在这种特殊情况下使用它并没有获得成功,因此建议您看一下 。
Selenium使用一个真正的浏览器-您不必处理解析ajax调用的结果。 例如,以下是从第一个评论页面获取评论标题和等级列表的方法:
from selenium.webdriver.firefox import webdriver
driver = webdriver.WebDriver()
driver.get('http://www.walmart.com/ip/29701960?page=seeAllReviews')
for review in driver.find_elements_by_class_name('BVRRReviewDisplayStyle3Main'):
title = review.find_element_by_class_name('BVRRReviewTitle').text
rating = review.find_element_by_xpath('.//div[@class="BVRRRatingNormalImage"]//img').get_attribute('title')
print title, rating
driver.close()
打印:
Renee Culver loves Clorox Wipes 5 out of 5
Men at work 5 out of 5
clorox wipes 5 out of 5
...
另外,请考虑可以使用无头PhantomJS浏览器( )。
另一个选择是利用 。
希望能有所帮助。