Javascript 带post请求的屏幕抓取tripadvisor

Javascript 带post请求的屏幕抓取tripadvisor,javascript,python,http-post,screen-scraping,Javascript,Python,Http Post,Screen Scraping,我在试着刮tripadvisor。假设我想对这家酒店的负面评论进行删减: 我只想要“糟糕”类别,这个选择/过滤应该由html表单控制。 我计划发送一个post请求来提交表格。我最初想使用mechanize模块中的br.submit(),但后来发现它不支持javascript。所以我希望使用post请求绕过javascript 但当我使用mechanize查看相关控件时,单选按钮具有相同的值。 这是我的密码: br = mechanize.Browser() br.set_handle_equi

我在试着刮tripadvisor。假设我想对这家酒店的负面评论进行删减:

我只想要“糟糕”类别,这个选择/过滤应该由html表单控制。 我计划发送一个post请求来提交表格。我最初想使用mechanize模块中的br.submit(),但后来发现它不支持javascript。所以我希望使用post请求绕过javascript

但当我使用mechanize查看相关控件时,单选按钮具有相同的值。 这是我的密码:

br = mechanize.Browser()
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
br.open("http://www.tripadvisor.com/Hotel_Review-g31441-d224344-Reviews-Hilton_Garden_Inn_Bentonville-Bentonville_Arkansas.html#REVIEWS")

for f in br.forms():
    print f
以下是其中的相关表单和控件:

 <POST http://www.tripadvisor.com/SortReviews#REVIEWS application/x-www-form-urlencoded
   <RadioControl(segRdo=[on, on, on, on, on])>
   <RadioControl(comRdo=[on, on, on, on, on])>
   <HiddenControl(returnTo=__2F__Hotel__5F__Review__2D__g31441__2D__d224344__2D__Reviews__2D__Hilton__5F__Garden__5F__Inn__5F__Bentonville__2D__Bentonville__5F__Arkansas__2E__html#REVIEWS) (readonly)
   <HiddenControl(filterSegment=0) (readonly)>
   <HiddenControl(filterRating=1) (readonly)>>
之后:

(br.form.find_control("comRdo","radio")).items[4].selected=True
print control_com.name,control_com.value,control_com.type
comRdo ['on'] radio
因此,选择“糟糕”类别后,控件的值为“开”,如果我选择了任何其他类别,该值将相同。当我在comRdo控件中打印项目时:只有“id”不同,其他所有属性都相同:

<Item name='on' id='com1' id='com1' type='radio' class='radio' value='on' name='comRdo'>
<Item name='on' id='com2' id='com2' type='radio' class='radio' value='on' name='comRdo'>
...
我还尝试了其他post数据的代码:

form={"comRdo":["on","on","on","on","on","*on"]}

有人能帮我一下吗?此页面如何使用相同值的单选按钮?如何以编程方式筛选评论??提前谢谢


感谢Slater Tyranus和Diadara,我下面的代码成功了

form={"returnTo":"__2F__Hotel__5F__Review__2D__g31441__2D__d224344__2D__Reviews__2D__Hilton__5F__Garden__5F__Inn__5F__Bentonville__2D__Bentonville__5F__Arkansas__2E__html#REVIEWS","filterSegment":"0","filterRating":"1"}
url="http://www.tripadvisor.com/SortReviews#REVIEWS"
headers={'content-type':'application/x-www-form-urlencoded'}
r=requests.post(url,data=form)
soup=BeautifulSoup(r.content)

如果你想知道一个站点的POST请求通常是如何工作的,你应该检查Google Chrome中的元素并切换到网络选项卡。您将能够看到您的POST请求通过

如果你点击那个帖子请求,你会得到关于你在那个帖子请求中实际发送的信息的详细信息

在较低的级别上,检查该元素后,您会注意到它嵌入到另一个元素中,并带有以下标记:

onclick="document.forms.REVIEW_FILTER_FORM.filterRating.value='1';document.forms.REVIEW_FILTER_FORM.submit();"
这意味着您需要从onclick方法开始搜索,因为当您单击该值时,实际情况就是这样

如果您所要做的只是取回数据,那么就不需要使用任何强大的抓取框架。我个人建议使用requests和lxml。在请求中,发送此post请求的方式为:

requests.post(url, data={"filterRating":1})

如果您真的想处理页面上的javascript,那么您应该使用或进行无标题web浏览。

正如另一个答案所指出的,只需查看网络选项卡,了解浏览器发出了什么请求。在这种情况下,您的表单有多个元素,所有元素都是生成所需页面所必需的。所以你应该使用

所有这些价值观

comRdo:on
returnTo:__2F__Hotel__5F__Review__2D__g31441__2D__d224344__2D__Reviews__2D__Hilton__5F__Garden__5F__Inn__5F__Bentonville__2D__Bentonville__5F__Arkansas__2E__html#REVIEWS
filterSegment:0
filterRating:1
此外,您会发现您实际上提交到了错误的url,请查看表单的操作字段或chromes网络选项卡


打开“网络”选项卡,单击“保留日志”,单击生成结果的链接,然后查看请求以了解您应该做什么

谢谢!但问题是,我不明白网络选项卡显示了什么。更具体地说,我不知道在哪里查找post参数。你可以详细阐述更多或者给我一个链接的一个教程的一个链接的一个链接的一个链接的一个教程的一个链接的一个或者你可以详细阐述更多或者给我一个链接的一个或者一个更多的详细的或者给我一个链接的一个链接的一个教程的一个行动行动的一个行动的一个或一个或三个或三个或三个或三个以上的意见的意见,这意味着代码的代码应该是:数据的数据::::::::,数据::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::#审阅“筛选器段”:“0”“Flash”:“1”}请求。“())您可以使用官方文档,您可以在YouTube上找到Chrome DeVoots上的大量教程,如果您觉得它有用的话,请考虑投票或接受我的答案。
onclick="document.forms.REVIEW_FILTER_FORM.filterRating.value='1';document.forms.REVIEW_FILTER_FORM.submit();"
requests.post(url, data={"filterRating":1})
comRdo:on
returnTo:__2F__Hotel__5F__Review__2D__g31441__2D__d224344__2D__Reviews__2D__Hilton__5F__Garden__5F__Inn__5F__Bentonville__2D__Bentonville__5F__Arkansas__2E__html#REVIEWS
filterSegment:0
filterRating:1