python通过链接抓取网站详解
在本篇文章里,你将会学习把这些基本方法融合到一个更灵活的网站爬虫中,该爬虫可以跟踪任意遵循特定URL模式的链接。
这种爬虫非常适用于从一个网站抓取所有数据的项目,而不适用于从特定搜索结果或页面列表抓取数据的项目。它还非常适用于网站页面组织得很糟糕或者非常分散的情况。
这些类型的爬虫并不需要像上一节通过搜索页面进行抓取中采用的定位链接的结构化方法,因此在Website对象中不需要包含描述搜索页面的属性。但是由于爬虫并不知道待寻找的链接的位置,所以你需要一些规则来告诉它选择哪种页面。你可以用targetPattern(目标URL的正则表达式)和布尔变量absoluteUrl来达成这一目标:
classWebsite:
def__init__(self,name,url,targetPattern,absoluteUrl,
titleTag,bodyTag):
self.name=name
self.url=url
self.targetPattern=targetPattern
self.absoluteUrl=absoluteUrl
self.titleTag=titleTag
self.bodyTag=bodyTag
classContent:
def__init__(self,url,title,body):
self.url=url
self.title=title
self.body=body
defprint(self):
print("URL:{}".format(self.url))
print("TITLE:{}".format(self.title))
print("BODY:\n{}".format(self.body))
Content类和第一个爬虫例子中使用的是一样的。
Crawler类从每个网站的主页开始,定位内链,并解析在每个内链页面发现的内容:
importre
classCrawler:
def__init__(self,site):
self.site=site
self.visited=[]
defgetPage(self,url):
try:
req=requests.get(url)
exceptrequests.exceptions.RequestException:
returnNone
returnBeautifulSoup(req.text,'html.parser')
defsafeGet(self,pageObj,selector):
selectedElems=pageObj.select(selector)
ifselectedElemsisnotNoneandlen(selectedElems)>0:
return'\n'.join([elem.get_text()for
eleminselectedElems])
return''
defparse(self,url):
bs=self.getPage(url)
ifbsisnotNone:
title=self.safeGet(bs,self.site.titleTag)
body=self.safeGet(bs,self.site.bodyTag)
iftitle!=''andbody!='':
content=Content(url,title,body)
content.print()
defcrawl(self):
"""
获取网站主页的页面链接
"""
bs=self.getPage(self.site.url)
targetPages=bs.findAll('a',
href=re.compile(self.site.targetPattern))
fortargetPageintargetPages:
targetPage=targetPage.attrs['href']
iftargetPagenotinself.visited:
self.visited.append(targetPage)
ifnotself.site.absoluteUrl:
targetPage='{}{}'.format(self.site.url,targetPage)
self.parse(targetPage)
reuters=Website('Reuters','https://www.reuters.com','^(/article/)',False,
'h1','div.StandardArticleBody_body_1gnLA')
crawler=Crawler(reuters)
crawler.crawl()
与前面的例子相比,这里的另外一个变化是:Website对象(在这个例子中是变量reuters)是Crawler对象本身的一个属性。这样做的作用是将已访问过的页面存储在爬虫中,但是也意味着必须针对每个网站实例化一个新的爬虫,而不是重用一个爬虫去抓取网站列表。
不管你是选择一个与网站无关的爬虫,还是将网站作为爬虫的一个属性,这都是一个需要根据自身需求进行权衡的决定。两种方法在功能实现上都是没有问题的。
另外需要注意的是,这个爬虫会从主页开始抓取,但是在所有页面都被记录后,就不会继续抓取了。你可能希望编写一个爬虫,将第3章中介绍的某种模式融合进来,然后查看所访问的每个页面中更多的目标URL。你甚至还可以跟踪每个页面中涉及的所有URL(不仅仅是匹配目标模式的URL),然后查看这些URL是否包含目标模式。
以上就是关于python抓取网站的相关知识点内容,感谢大家的学习和对毛票票的支持。