我写了一个简单的解析器,它访问了网站的主页和主页上的内部链接。基本上,从主页开始,它进入网站结构深入1级,并搜索匹配正则表达式的字符串。它也执行JS。适用于电子邮件,电话号码或任何格式良好的数据。这是代码:
pages = set()
def getPage(startUrl):
user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (user_agent)
driver = webdriver.PhantomJS(executable_path="/Users/mainuser/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs", desired_capabilities=dcap)
# print("in get page: "+startUrl)
try:
driver.set_page_load_timeout(10)
driver.get(startUrl)
return BeautifulSoup(driver.page_source,"html.parser")
except:
print("returning NOne")
return None
def traverseHomePage(startUrl):
if startUrl.endswith("/"):
startUrl = startUrl[:-1]
try:
driver = webdriver.PhantomJS(executable_path="/Users/mainuser/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs")
driver.get(startUrl)
except HTTPError as e:
print(e)
# print(pageUrl+" ")
pass
except URLError as e:
print(e)
pass
else:
bsObj = BeautifulSoup(driver.page_source,"html.parser")
text = str(bsObj)
listRegex = re.findall( r'someregexhere', text)
print(listRegex+" do something with data")
for link in bsObj.findAll("a", href=re.compile("^((?!#|javascript|\.png|\.jpg|\.gif).)*$")):
if 'href' in link.attrs:
if ("http://" in link.attrs['href'] or "https://" in link.attrs['href']) and startUrl in link.attrs['href']:
print("internal aboslute: "+startUrl+" is in "+link.attrs['href'])
#absolute link
if 'href' in link.attrs:
if link.attrs['href'] not in pages:
#We have encountered a new page
newPage = link.attrs['href']
oneLevelDeep(newPage)
elif ("http://" in link.attrs['href'] or "https://" in link.attrs['href'] or "mailto" in link.attrs['href']) and (startUrl not in link.attrs['href']):
print("outside link"+link.attrs['href'])
# print(link.attrs['href'])
continue
else:
print("internal relative: "+link.attrs['href'] )
#relative link
if 'href' in link.attrs:
if link.attrs['href'] not in pages:
#We have encountered a new page
newPage = link.attrs['href']
pages.add(newPage)
if newPage.startswith("/"):
pass
# print("/"+newPage)
else:
newPage = "/"+newPage
pages.add(newPage)
oneLevelDeep(startUrl+newPage)
def oneLevelDeep(startUrl):
# print(startUrl)
if startUrl.endswith("/"):
startUrl = startUrl[:-1]
try:
# print("stUrl: "+startUrl+pageUrl)
bsObj = getPage(startUrl)
if bsObj != "None":
text = str(bsObj)
text = str(bsObj)
listRegex = re.findall( r'someregexhere', text)
print(listRegex+" do something with data")
#
except HTTPError as e:
# print(e)
# print(pageUrl+" ")
pass
except URLError as e:
# print(e)
pass
使用示例:traverseHomePage("http://homepage.com")
我跑了这个刮刀一段时间,它的速度令人难以置信。我在Eclipse中复制了我的项目8次,并且在12小时内仍然只搜索了1000页我能做些什么来提高它的速度?我非常怀疑google bot每天只能索引250页。
我认为瓶颈是机器人每分钟发出的页面请求量。它每隔几秒就做一次。我已经读过每秒制作50个请求的机器人(并且你不应该这样做)。这不是这个。
我可以做些什么来提高抓刮速度?我正在运行Eclipse localhost中的代码。如果我搬到服务器会有帮助吗?我应该以某种方式告诉服务器不向我发送图像,以便我使用更少的带宽?是否可以发出异步请求?多个脚本是否同时运行?欢迎任何想法。
答案 0 :(得分:1)
问题是您正在加载网页,就像浏览器要访问该页面一样。如果您打开homepage.com并转到开发人员菜单然后进入网络(至少在Chrome上),您会注意到此页面需要很长时间才能加载。在我的情况下,它花了7秒钟,最后一个文件是谷歌地图认证文件。
Google可以快速解析问题,因为它在服务器上有服务器来执行解析,因为它只查看几个文件,从根目录开始,它访问该页面上的每个链接以及之后每个后续页面上的每个链接。它不需要等待整个页面加载。它只需要每个站点的原始html。
等待javascript,并下载整个网站,css和所有(而不是只有一个html文件)正在减慢你的搜索速度。我会使用请求获取裸html并从那里开始工作。