python通过链接抓取网站详解
Python  /  管理员 发布于 7年前   299
在本篇文章里,你将会学习把这些基本方法融合到一个更灵活的网站 爬虫中,该爬虫可以跟踪任意遵循特定 URL 模式的链接。
这种爬虫非常适用于从一个网站抓取所有数据的项目,而不适用于从特 定搜索结果或页面列表抓取数据的项目。它还非常适用于网站页面组织 得很糟糕或者非常分散的情况。
这些类型的爬虫并不需要像上一节通过搜索页面进行抓取中采用的定位 链接的结构化方法,因此在 Website 对象中不需要包含描述搜索页面 的属性。但是由于爬虫并不知道待寻找的链接的位置,所以你需要一些 规则来告诉它选择哪种页面。你可以用 targetPattern(目标 URL 的 正则表达式)和布尔变量 absoluteUrl 来达成这一目标:
class Website: 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 = bodyTagclass Content: def __init__(self, url, title, body): self.url = url self.title = title self.body = bodydef print(self): print("URL: {}".format(self.url)) print("TITLE: {}".format(self.title)) print("BODY:\n{}".format(self.body))
Content 类和第一个爬虫例子中使用的是一样的。
Crawler 类从每个网站的主页开始,定位内链,并解析在每个内链页面 发现的内容:
import reclass Crawler: def __init__(self, site): self.site = site self.visited = []def getPage(self, url): try:req = requests.get(url) except requests.exceptions.RequestException: return Nonereturn BeautifulSoup(req.text, 'html.parser')def safeGet(self, pageObj, selector):selectedElems = pageObj.select(selector)if selectedElems is not None and len(selectedElems) > 0:return '\n'.join([elem.get_text() forelem in selectedElems])return ''def parse(self, url):bs = self.getPage(url)if bs is not None:title = self.safeGet(bs, self.site.titleTag)body = self.safeGet(bs, self.site.bodyTag)if title != '' and body != '':content = Content(url, title, body)content.print()def crawl(self):"""获取网站主页的页面链接"""bs = self.getPage(self.site.url)targetPages = bs.findAll('a',href=re.compile(self.site.targetPattern))for targetPage in targetPages:targetPage = targetPage.attrs['href']if targetPage not in self.visited:self.visited.append(targetPage)if not self.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抓取网站的相关知识点内容,感谢大家的学习和的支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号