2014-11-22 68 views
2

我使用BeautifulSoup的API在Python中创建了一个webcrawler。当抓取某些站点时,webcrawler使用相同的头信息/用户代理。我注意到,当我在两台不同的计算机上运行同一确切脚本(一个在我的笔记本电脑上,另一个在服务器上)抓取给定站点时,它们产生不同的结果。通过“不同的结果”,我的意思是在服务器上运行的脚本不会爬到网站上的所有链接。例如,如果我想抓取Macys.com,我的笔记本电脑上的脚本会爬到每个部门(家庭,洗浴,女性,男性等),而在服务器上运行的脚本将错过洗浴部门。这让我非常困惑,因为他们都使用相同的头文件信息/用户代理相同的脚本来抓取相同的站点。我想不出任何其他的设置,可能会导致这在两台不同的机器上产生不同结果的Webcrawling脚本

下面是我在Python中定义我的用户代理和创建汤对象

user_agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7" 
hdr={'User-Agent':user_agent} 
response = urlopen(Request(current_url, headers=hdr)) 
html = response.read() 
soup = BeautifulSoup(html, "lxml") 
+0

而你总是显式地指定(在这种情况下'lxml')解析器?你在本地和服务器上都安装了lxml吗?谢谢。 – alecxe 2014-11-23 01:05:19

+0

您在两台机器上获得的html是否相同? – Isaac 2014-11-23 01:07:28

+0

@Isaac,没有html确实是不同的 – lollerskates 2014-11-23 01:14:19

回答

2

如果你没有明确指定的解析器, BeautifulSoupwill pick up the underlying parser automatically

如果不指定任何东西,你会得到所安装的 最好的HTML解析器。 Beautiful Soup将lxml的解析器评为最好,然后是 html5lib,然后是Python的内置解析器。

这里的问题是它在本地和服务器上选择不同的解析器,这取决于python环境中可用/安装的模块。而且,因为有differences between parsers,您会看到不同的结果。

明确指定解析器,适合您的需要,例如:

soup = BeautifulSoup(html, "lxml") 
+0

所以如果我正确理解这一点,当我没有指定明确的解析器来使用时,脚本在服务器上运行可能是使用不同于我笔记本上的解析器的解析器? – lollerskates 2014-11-23 01:25:12

+0

@lollerskates这正是我想要解释的。请检查。 – alecxe 2014-11-23 01:25:36

+0

hey alec我检查了正在服务器上运行的脚本正在用户的解析器。它运行'html.parser',这就是为什么会产生不同的结果。谢谢! – lollerskates 2014-11-23 18:30:57

相关问题