php正则函数抓取网页连接(爬虫也可以称为Python爬虫不知 )

优采云 发布时间: 2021-11-09 15:01

  php正则函数抓取网页连接(爬虫也可以称为Python爬虫不知

)

  爬虫也可以称为Python爬虫

  不知何时,语言Python和爬行动物就像一对恋人。

  当您谈到爬虫时,您会想到 Python。当您谈到 Python 时,您会想到人工智能……和爬虫。

  因此,在谈到爬虫时,大多数程序员都会下意识地将其联想为 Python 爬虫。为什么会这样?我认为有两个原因:

  任何学习 Python 的程序员都应该或多或少看过甚至研究过爬虫。我当时写 Python 的目的很纯粹就是为了写爬虫。

  所以这篇文章的目的很简单,就是谈谈我个人对Python爬虫的理解和实践。作为一个程序员,我觉得只有了解爬虫的相关知识才对你有好处,所以看完这篇文章 ,如果对你有帮助就太好了

  什么是爬虫

  爬虫是一个程序。这个程序的目的是爬取万维网的信息资源。比如你日常使用的谷歌等搜索引擎,搜索结果都是依赖爬虫定期获取的。

  

  看上面的搜索结果,除了wiki相关的介绍外,所有爬虫相关的搜索结果都收录了Python。前辈说的是Python爬虫,现在看来真的不骗我了~

  爬虫的目标对象也很丰富,无论是文字、图片、视频,任何结构化和非结构化数据爬虫都可以爬取。经过爬虫的发展,衍生出各种爬虫类型:

  不想讲这些笼统的概念,让我们以一个网页内容获取为例,从爬虫技术本身开始,来谈谈网络爬虫,步骤如下:

  什么是爬虫,这是爬虫:

  <p>"""让我们根据上面说的步骤来完成一个简单的爬虫程序"""

  import requests

  <br />

  from bs4 import BeautifulSoup

  <br />

  target_url = 'http://www.baidu.com/s?wd=爬虫'

  <br />

  # 第一步 发起一个GET请求

  res = requests.get(target_url)

  <br />

  # 第二步 提取HTML并解析想获取的数据 比如获取 title

  soup = BeautifulSoup(res.text, "lxml")

  # 输出 soup.title.text

  title = soup.title.text

  <br />

  # 第三步 持久化 比如保存到本地

  with open('title.txt', 'w') as fp:

      fp.write(title)</p>

  不到20行代码加注释,就完成了一个爬虫,简单

  如何编写爬虫

  网络世界丰富多彩,有数以亿计的网络资源供您选择。如何让你的爬虫程序在面对不同的页面时健壮耐用是一个值得讨论的问题

  俗话说,磨刀不误砍柴。在开始写爬虫之前,有必要掌握一些基础知识:

  这两个描述反映了爬虫开发者需要掌握的基础知识,但是一个基本的后端或者前端工程师可以做到。这也说明爬虫的入门难度是极低的。从这两句话,你能想到爬虫必备的知识点吗?

  有了这些知识储备,你就可以选择一种语言,开始编写自己的爬虫程序了。或者按照上一节提到的三个步骤,然后以Python为例,谈谈在编程语言中要做哪些准备:

  一旦掌握了以上内容,就可以放开手脚,做很多功课了。万维网是你的名利场,去吧!

  我认为对于一个目标网站的网页,可以分为以下四种:

  这是什么意思?这可能看起来有点令人费解,但你明白这一点。写好爬虫后,只需要在脑海中浏览网页的类型,然后应用对应类型的程序(写的太多,应该有自己的常用代码库),写的速度爬虫自然不慢

  单页单目标

  通俗地说,在这个网页中,我们的目标只有一个。假设我们需要抓取这部电影的名字——肖申克的救赎,首先打开网页右键查看元素,找到电影名字对应的元素位置,如下图:

  

  单页看是否只有一个target,标题的CSS Selector规则一目了然:#content&gt; h1&gt; span:nth-child(1),然后使用common自己写的库,不到十行代码就可以写一个爬取这个页面的电影名的爬虫:

  <p>import asyncio

  <br />

  from ruia import Item, TextField

  <br />

  class DoubanItem(Item):

      title = TextField(css_select='#content > h1 > span:nth-child(1)')

  <br />

  async_func = DoubanItem.get_item(url="https://movie.douban.com/subject/1292052/")

  item = asyncio.get_event_loop().run_until_complete(async_func)

  print(item.title)</p>

  Multi-page multi-target 在这种情况下是多个 URL 的衍生

  单页多目标

  假设当前的需求是抓取豆瓣电影250第一页的所有电影名,需要提取25个电影名,因为这个目标页面的目标数据是多项,所以需要循环获取目标,这就是所谓的具有多个目标的单页:

  

  <p>import asyncio

  <br />

  from ruia import Item, TextField

  <br />

  class DoubanItem(Item):

      target_item = TextField(css_select='div.item')

      title = TextField(css_select='span.title')

  <br />

      async def clean_title(self, title):

          if isinstance(title, str):

              return title

          else:

              return ''.join([i.text.strip().replace('\xa0', '') for i in title])

  <br />

  <br />

  async_func = DoubanItem.get_items(url="https://movie.douban.com/top250")

  items = asyncio.get_event_loop().run_until_complete(async_func)

  for item in items:

      print(item)</p>

  多页多目标

  多页多目标是上述单页多目标情况的派生。从这个角度来说,就是获取此时所有页面的电影名称。

  

  <p>from ruia import TextField, Item, Request, Spider

  <br />

  <br />

  class DoubanItem(Item):

      """

      定义爬虫的目标字段

      """

      target_item = TextField(css_select='div.item')

      title = TextField(css_select='span.title')

  <br />

      async def clean_title(self, title):

          if isinstance(title, str):

              return title

          else:

              return ''.join([i.text.strip().replace('\xa0', '') for i in title])

  <br />

  <br />

  class DoubanSpider(Spider):

      start_urls = ['https://movie.douban.com/top250']

      concurrency = 10

  <br />

      async def parse(self, res):

          etree = res.html_etree

          pages = ['?start=0&filter='] + [i.get('href') for i in etree.cssselect('.paginator>a')]

  <br />

          for index, page in enumerate(pages):

              url = self.start_urls[0] + page

              yield Request(

                  url,

                  callback=self.parse_item,

                  metadata={'index': index},

                  request_config=self.request_config

              )

  <br />

      async def parse_item(self, res):

          items_data = await DoubanItem.get_items(html=res.html)

          res_list = []

          for item in items_data:

              res_list.append(item.title)

          return res_list

  <br />

  <br />

  if __name__ == '__main__':

      DoubanSpider.start()</p>

  如果网络正常,您将获得以下输出:

  

  注意爬虫运行时间,小于1s,这就是异步的魅力

  用Python写爬虫就是这么简单优雅,大家看看网页,想一想:

  一个爬虫程序就形成了。顺便说一句,爬虫可以说是反君子,而不是小人。大部分robots.txt网站(它的目的是告诉爬虫什么可以爬,什么不能爬,比如:),你想怎么爬,自己衡量

  如何推进

  不要以为只要写一个爬虫程序就可以了。这个时候,还有更多的问题等着你。你要深情地看你的爬虫程序,问自己三个问题:

  关于人性的前两个问题这里就不多说了,直接跳过,但是如果你是爬虫工程师,千万不要跳过

  会被反爬行动物杀死吗?

  最后,关于反爬虫的问题是你的爬虫程序是否强大的关键因素。什么是反爬虫?

  当网络上越来越多的爬虫横行时,为了防止自己的数据被爬取,网络资源维护者开始实施一系列措施,使自己的数据不易被其他程序爬取。这些措施是反爬虫。

  如检测IP访问频率、资源访问速度、链接是否有关键参数、验证码检测机器人、ajax混淆、js加密等。

  针对目前市场上的反爬虫,爬虫工程师经常有的反爬虫方案如下:

  爬虫工程师的进阶之路,其实就是不断反爬虫,可谓艰辛,但换个角度想想也挺好玩的。

  关于框架

  爬虫有自己的写作过程和标准。有了标准,自然就会有框架。自然有很多像Python这样的生态强大的语言。自然有许多框架。目前,世界上使用最多的包括:

  在这里就不过多介绍了,框架只是一个工具,是提高效率的一种方式,自己选择

  阐明

  一切都有两个方面,爬虫也不例外,所以我给你发一张图,关键时刻想一想。

  

  以前的建议:

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线