python web爬行

时间:2012-12-28 10:28:01

标签: python web-crawler scrapy

  

可能重复:
  Python - web crawling

最后一个问题因为“含糊不清”而被关闭。所以我将在这里具体说明:

考虑一下这个网站: http://www.tripadvisor.in/

以及底部的评论, 我需要能够打开审阅者的个人资料,并提取年龄,性别和位置等信息(如果是公开的)。

如何实现这一目标的逐步过程将不胜感激。

PS:这可以使用scrapy吗?

更新:假设我有一个包含用户名称的数据库,我可以直接打开会员的个人资料,例如,对于Lulak

http://www.tripadvisor.in/members/Lulak

如何从此页面中提取年龄,性别和位置

由于

2 个答案:

答案 0 :(得分:2)

通过两个个人资料页面,我发现此div包含个人信息

<div id="amd" style="display: block">

并且id amd未在其他任何地方使用,因此您可以将搜索范围缩小到此特定div。之后,只是搜索相关信息的简单案例。您只需找到<dt><dd>代码 -

即可
<dt>Location:</dt> <dd>Switzerland</dd>

我认为你可以处理其余的事情。

答案 1 :(得分:1)

是的,Scrapy绝对可以做到这一点。如果您只是打开一个您知道的网址列表而不是抓取网站,我会说Scrapy是过度的。

我建议lxml用于HTML解析,它比BeautifulSoup简单且快得多(可以多达两个数量级)。而requests适用于HTTP,因为它非常简单。

在下面的代码段中,我使用XPath查询来查找正确的定义描述元素。 //dl[dt/text()='term']//dd/text()基本上是说&#34;找到定义列表(dl)元素,其定义术语的文本内容为&#39; term&#39; (//dl[dt/text()='term'])然后查找所有定义描述(dd)元素并获取其文本内容(//dd/text())&#34;。

from StringIO import StringIO
import requests
from lxml import etree

response = requests.get("http://www.tripadvisor.in/members/SomersetKeithers")

parser = etree.HTMLParser()
tree   = etree.parse(StringIO(response.text), parser)

def get_definition_description(tree, term):
  description = tree.xpath("//dl[dt/text()='%s']//dd/text()" % term)
  if len(description):
    return description[0].strip()

print get_definition_description(tree, "Age:")
print get_definition_description(tree, "Gender:")
print get_definition_description(tree, "Location:")