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

优采云 发布时间: 2022-01-14 08:17

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

  在本文 文章 中,您将学习将这些基本方法合并到一个更灵活的 网站 爬虫中,该爬虫可以跟踪遵循特定 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爬取的相关知识点网站,感谢大家对Scripting Home的学习和支持。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线