网站内容抓取(如何融合到一个更灵活的网站爬虫中?)

优采云 发布时间: 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 对象本身的一个属性。这样做的效果是在爬虫中存储了访问过的页面,但这也意味着必须为每个网站实例化一个新的爬虫,而不是重复使用一个爬虫来爬取网站的列表。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线