网站内容抓取(如何融合到一个更灵活的网站爬虫中?)
优采云 发布时间: 2021-12-31 21:09网站内容抓取(如何融合到一个更灵活的网站爬虫中?)
在这个 文章 中,您将学习将这些基本方法集成到一个更灵活的 网站 爬虫中,该爬虫可以跟踪任何遵循特定 URL 模式的链接。
这种爬虫非常适合从网站中抓取所有数据的项目,但不适用于从特定搜索结果或页面列表中抓取数据的项目。也非常适合网站页面组织不善或非常分散的情况。
这些类型的爬虫不需要上一节中爬取搜索页面时使用的定位链接的结构化方法,因此不需要在网站对象中收录描述搜索页面的属性。但是因为爬虫不知道要找到的链接的位置,所以需要一些规则来告诉它选择哪个页面。您可以使用 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 = bodyTag
class Content:
def __init__(self, url, title, body):
self.url = url
self.title = title
self.body = body
def print(self):
print("URL: {}".format(self.url))
print("TITLE: {}".format(self.title))
print("BODY:\n{}".format(self.body))
Content 类与第一个爬虫示例中使用的类相同。
Crawler类从每个网站的首页开始,定位内链,解析每个内链页面找到的内容:
import re
class Crawler:
def __init__(self, site):
self.site = site
self.visited = []
def getPage(self, url):
try:
req = requests.get(url)
except requests.exceptions.RequestException:
return None
return 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() for
elem 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()
<p>与前面的示例相比,这里的另一个变化是网站对象(在本示例中为变量 reuters)是 Crawler 对象本身的一个属性。这样做的效果是在爬虫中存储了访问过的页面,但这也意味着必须为每个网站实例化一个新的爬虫,而不是重复使用一个爬虫来爬取网站的列表。