一篇文章带你入门爬虫丶刷网课丶刷文章阅读量丶刷刷刷。

来源:csdn博客 分类: 其他 发布时间:2020-03-19 10:25:27 最后更新:2020-03-19 浏览:490
转载声明:
本文为摘录自“csdn博客”,版权归原作者所有。
温馨提示:
为了更好的体验,请点击原文链接进行浏览
摘录时间:
2020-03-19 10:25:27

走过路过不要错过,学不会没关系,长点见识也是可以的啦。

简介

博主于17年开始自学的python, 期间做过各个领域的python开发,包括爬虫, web, 硬件, 桌面应用, AI, 数据分析

可能有人会问python能做硬件开发?可自行搜索pyboard树莓派MicroPython, 描述python最有精髓的一句话: python 除了不能生孩子, 啥都能干。
在这里插入图片描述

通过该篇文章,读者可以发现爬虫入门并不难,还可以知道那些大学生网络刷视频课程的实现原理,以及抢票工具的实现原理,并且可以自己动手编写一个简单爬虫。当然入门容易, 出来未并容易。
在这里插入图片描述
其实很多东西看似难,其实很容易,你觉得难的原因仅仅是因为你不知道它的原理, 奉劝读者学习的过程中多了解一下实现原理, 这也是我切身体会。
在这里插入图片描述

本质

  • 爬虫是一种获取网络信息的脚本,方便帮助人们快速的丶大量的从网络上的获取一些信息。
  • 简单地说,比如你在一个网站上看到很多坏坏的图,你好喜欢,想下载下来,但是一个个点太费劲了,如果你是个妹子,或许能喊来一群甜 dog帮你。
    在这里插入图片描述
  • 但是像博主这种没人疼, 没人爱单身dog, 只能靠自己的双手了,三下五除二, 撸了一段代码搞定,代码如下:

























  • 代码呢? 年轻人做事不能这么着急,慢慢来嘛, 讨厌心急吃不了热豆腐

在这里插入图片描述

  • 紧接着,博主继续阐述爬虫的本质。上文说到爬虫是自动化获取网络信息的脚本。, 那么脚本操作的本质又是啥? 要知道脚本的操作本质,那么得知道你操作浏览器时,人家浏览器是怎么操作的,例如:
    • 当你点击一个页面的时候,客户端浏览器向指定的服务器发送一个GET请求,服务端接受到该请求之后便会返回响应内容,客户端浏览器接受到响应内容便会进行解析渲染,此时你就看到了页面上的内容。这期间还涉及客户端是如何找到服务端的(DNS协议), 客户端跟服务端是如何通信的(TCP协议), 这两个协议这里就不作解析了,再说就超纲了,博主是一个正直的男人(单身,划重点),违背伦理道德的事我不干,可以自行和百度老师好好深入交流。

    • 当你想点赞我的文章时候,此时万恶的浏览器告诉你(其实罪魁祸首是服务器端代码),需要登录,你拒绝登录的话,那么我就损失了一个赞,所以你还是行行好,登录一下点赞吧, 你是个好人
      在这里插入图片描述
      在登录的时候,发现你没有注册,不管注册还是登录,你需要在浏览器输入账号密码(扫码登录), 当你操作完成之后点登录,客户端浏览器会向服务端发送一个POST请求进行操作,服务端会进行一系列的操作然后响应给客户端,客户端浏览器会弹出提示告诉你操作状态(登录成功, 或者失败)。GET请求和POST请求有什么不同? GET请求的内容实体会带在网址的后面,POST请求的内容实体会带在请求体里面。还有XXX, 不告诉你(百度)。

    • 了解了请求的GETPOST,对于本篇文章已经够用了(还有PUT,DELETE,OPTION), 如果想深入了解的可以百度搜索: 详解HTTP请求 , 写太深入就没人看了。在这里插入图片描述

  • 网络刷课,抢票软件,刷文章访问量等软件的实现原理也是基于网络请求的操作,只不过很多站点会增加一些反爬虫机制,如ip限制,登录加密,操作内容体加密,当然这些也是可以搞定的。

Python

也不知道我的读者有没有学过python, 甚至可能没有学过编程,但是没关系,很简单的。
接下来,带你如何快速入门python:





































由于一篇文章的篇幅有限, 请自行查找python入门教程, 如果觉得不够,可以私信我写。

本人就是网上闷骚男, 网下腼腆男
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200221120410615.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NsYXNzbWF0ZUxpbg==,size_16,color_FFFFFF,t_70

实战

  • 各位看官,现在又到了紧张的实战环节, 我狂铁贼六,又狂又头铁, 进可一打五,退可六分投
    在这里插入图片描述

  • 首先介绍两个Python的三方模块requests, BeautifulSoup

    • requests是一个网络请求库,用于实现上文说到的GET, POST等请求,官方文档点我
    • BeautifulSoup库是一个网页文本解析模块,用于检索我们需要的内容, 官方文档点我
    • pip install requrests, pip install BeautifulSoup4分别安装这两个包。
  • 入门教程从简, 以一个斗图网的表情包套图页面为例,实现该页面下所有图片的下载, 点我查看网页

    • 先通过requests模块获取网页文本数据:

      import requests #  导入模块
      
      
      def get_html_text(url):  # 获取html文本内容
          """
          获取html文本
          :param url:
          :return:
          """
          return requests.get(url).text  # 这里通过GET请求拿到返回的网页文本内容
      
      
      if __name__ == '__main__':
          url = 'http://www.bbsnet.com/xiongmaoren-18.html'
          html_text = get_html_text(url)
          print(html_text)
      
      
      
    • 分析网页结构,鼠标对准图片,右键点检查元素, 如图:
      在这里插入图片描述
      在右图中可以看到,所有的图片均包含在id=post_content的div标签里面, 然后其下面是一些p标签,img中src有图片的链接,点进去可以直接看到一张图片。
      在这里插入图片描述
      现在要做的事情,就是提取这些图片链接,再通过GET请求和文件操作进行图片的保存。

    • 用BeautifouSoup查找这些图片的链接地址, 定义一个函数来完成这件事情:

      def get_images_urls(html_text):
          """
          获取图片链接
          :param html_text:
          :return:
          """
          urls = []   # 保存提取的url列表
          soup = BeautifulSoup(html_text, 'html.parser')  # 创建一个soup对象,可以打印出来看看里面的内容
          div_tag = soup.find('div', {'id': 'post_content'})  # 查找id=post_content的标签
          img_tag_list = div_tag.find_all_next('img')  # 查找div下面的所有img标签
          for img_tag in img_tag_list[:-4]:  # 观察找到结果发现从倒数第四个开始并不是表情包,所以只迭代到倒数第四个
              url = img_tag.attrs['src']   # 提取img标题的src元素的值
              urls.append(url)
          return urls
      
    • 然后需要定义一段代码,来完成图片的保存, 如下:

      def save_images(dir, urls):
          """
          保存图片
          :param urls:
          :return:
          """
          if not os.path.exists(dir):  # 使用os模块来判断文件夹是否存在,不存在则创建
              os.makedirs(dir)
          count = 1
          
          for url in urls:
              print('正在下载第{}张图片...'.format(str(count)))
              ext = url.split('.')[-1]  # 拿到图片的扩展名 
              filename = dir + '/' + str(count) + '.' + ext  # 拼接图片的存储路径
              content = requests.get(url).content  # 通过GET请求获取图片的二进制内容,注意拿网页源码时候是text
              with open(filename, 'wb') as f:  # 已写二进制的形式打开文件
                  f.write(content)  # 将图片内容写入
              count += 1   # count 用于图片命名和计数,递增1
      
      
    • 代码运行结果:
      在这里插入图片描述

    • 这时候就会有杠精说: 这一页不就15个图片嘛,我点几下就完事了,写个代码时间还比较长时间。又或者有虚心向学者问: 怎样爬取整个网站的图片或者某一分类下所有的图片。那么已斗图表情包分类下的图片为例子, 参照之前讲述的步骤, 看下网页结构:
      在这里插入图片描述
      可以看到右侧我圈红的框内容包含了一些li标签,li标签对应的就算每一个封面图, 我们要找到的就是蓝钱画出来的url,对应之前代码的url, 只要我们把这些url都找出来,再调用我们之前的代码就可以下载所有的图片了, 当然这里还涉及分页, 分页的操作方法也是一样的,只要我们把下一页的链接找出来,再进行访问,直到找不到下一页为止。

    • 贴上爬取单个页面的完整代码,爬取分类的读者自己琢磨怎么去实现。

      # _*_coding:utf8_*_
      # Project: spider
      # File: main.py
      # Author: ClassmateLin
      # Email: 406728295@qq.com
      # 有项目的可以滴滴我, Python/Java/PHP/Go均可。WX: ClassmateYue
      # Time: 2020/2/21 4:54 下午
      # DESC:
      import requests
      import os
      from bs4 import BeautifulSoup
      
      
      def get_html_text(url):
          """
          获取html文本
          :param url:
          :return:
          """
          return requests.get(url).text
      
      
      def get_images_urls(html_text):
          """
          获取图片链接
          :param html_text:
          :return:
          """
          urls = []   # 保存提取的url列表
          soup = BeautifulSoup(html_text, 'html.parser')  # 创建一个soup对象,可以打印出来看看里面的内容
          div_tag = soup.find('div', {'id': 'post_content'})  # 查找id=post_content的标签
          img_tag_list = div_tag.find_all_next('img')  # 查找div下面的所有img标签
          for img_tag in img_tag_list[:-4]:  # 观察找到结果发现从倒数第四个开始并不是表情包,所以只迭代到倒数第四个
              url = img_tag.attrs['src']   # 提取img标题的src元素的值
              urls.append(url)
          return urls
      
      
      def save_images(dir, urls):
          """
          保存图片
          :param urls:
          :return:
          """
          if not os.path.exists(dir):  # 使用os模块来判断文件夹是否存在,不存在则创建
              os.makedirs(dir)
          count = 1
      
          for url in urls:
              print('正在下载第{}张图片...'.format(str(count)))
              ext = url.split('.')[-1]  # 拿到图片的扩展名
              filename = dir + '/' + str(count) + '.' + ext  # 拼接图片的存储路径
              content = requests.get(url).content  # 通过GET请求获取图片的二进制内容,注意拿网页源码时候是text
              with open(filename, 'wb') as f:  # 已写二进制的形式打开文件
                  f.write(content)  # 将图片内容写入
              count += 1   # count 用于图片命名和计数,递增1
      
      
      if __name__ == '__main__':
          url = 'http://www.bbsnet.com/xiongmaoren-18.html'
          html_text = get_html_text(url)
          image_urls = get_images_urls(html_text)
          save_images('./images', image_urls)
      
      

说明

  • 读完这篇文章,你应该对爬虫有一定的了解了, 能够举一反三当然是最好了。
  • 本文示例的爬虫是最简单,没有任何反爬虫机制,想知道反爬虫机制有哪些的,可以自行百度了解。
  • 本文示例爬虫是html文本形式的解析,有些网站会用javascript动态生成网页,直播弹幕的爬虫需要分析websockt。
  • 网络刷课丶抢票软件及各种脚本的实现, 都是通过模拟这些网络请求来进行操作的,只不过有些需要登录丶或者有加密方式,app软件爬虫丶前后端分离站点需要对接口进行抓包分析。例如我Github上刷访问量的代码,点我查看
  • 爬虫难点不在于实现,而是在于分析,只要你分析到位了,写脚本就是简简单单的。
  • 这里演示的是没有采用框架的实现,有很多爬虫框架使得爬虫实现更为容易, 如Scrapy。有些网站需要javascript动态生成网页的,那么可以用selenium库来操作chrome等浏览器,实质上是为了拿到html纯文本进行数据的提取, 例如我Github这份代码进行百度SEO使用的就算selenium库,点我查看
  • 该实例实现的是单线程的,在数据量庞大的时候根本处理不过来,可以使用多线程丶多进程丶协程来进行操作。例如协程库:aiohttp, 可以点击参考我这篇文章

在这里插入图片描述

php技术微信