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

优采云 发布时间: 2022-01-05 09:06

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

  在这个 文章 中,您将学习将这些基本方法集成到一个更灵活的 网站 爬虫中,该爬虫可以跟踪任何遵循特定 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()

  与前面的示例相比,这里的另一个变化是网站对象(在本示例中为变量 reuters)是 Crawler 对象本身的一个属性。这样做的效果是在爬虫中存储了访问过的页面,但这也意味着必须为每个 网站 实例化一个新的爬虫,而不是重复使用一个爬虫来爬取 网站 的列表。

  是选择与网站无关的爬虫,还是使用网站作为爬虫的一个属性,这都是需要根据自己的需要权衡的决定。这两种方法在功能实现上都没有问题。

  还有一点需要注意的是,这个爬虫会从首页开始爬取,但是所有的页面都记录完之后,就不会继续爬取了。您可能希望编写一个收录第 3 章中介绍的一些模式的爬虫,然后在您访问的每个页面中查看更多目标 URL。您甚至可以跟踪每个页面中涉及的所有 URL(不仅仅是匹配目标模式的 URL),然后检查这些 URL 是否收录目标模式。

  以上就是关于python爬取的相关知识点网站,感谢大家的学习和支持。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线