简单的网页爬虫开发

📼网络连接与爬虫原理
在这里插入图片描述
网络连接

  • Client向Server发起一次Request(包含Header和Messge)
  • Server向Client返回一个Response(包含相应的HTML文件)

爬虫原理

  • 模拟Client向Server发起Request请求
  • 接收Server的Response并解析、提取所需信息

📼简单的网页爬虫开发
爬虫开发中常用的第三方库

  • 💡Requests库
    请求网站获取网页数据(HTTP,HyperText Transfer Protocol).
    比Python自带的urlib库更加简单、方便和人性化.
    用法:import requests
  • 💡BeautifulSoup库
    用于解析Requests库请求的网页,并把网页源代码解析成Soup文档,以便过滤提取数据.
    用法:from bs4 import BeautifulSoup
  • 💡Lxml库
    用于解析网页数据,是基于libxml2这个XML解析库的Python封装.
    使用C语言编写,解析速度比BeautifulSoup更快.

🔑Requests库

  • 🌿Requests库安装
>>>pip3 install reuqests

使用
浏览器来访问网页,看起来只需要输入网址即可.但其实网页有很多中打开方式,最常见的是GET方式和POST方式.
在浏览器里面可以直接通过输入网址访问的页面,就是使用了GET方式.
还有一些页面,只能通过从另一个页面单击某个连接或者某个按钮之后跳转访问,不能直接通过在浏览器输入网址访问,这种网页就是使用了POST方式.

  • 🌿Requests库–get方法
    对于使用GET方式的网页,可以使用requests的get()方法获取网页的源代码.
import requests
html = requests.get('网址').content.decode('编码方式')
#最常见的编码方式为'UTF-8','GBK','GB2312','GB18030'.
  • 🌿Requests库–post方法
    网页的访问方式除了GET方式外,还有POST方式,有一些网页,使用GET和POST方式访问同样的网址,得到的结果是不一样的;还有一些网页,只能使用POST方式访问,如果使用GET,可能会返回错误信息.
import reuquests
data = {'key1':'value1','key2':'value2'}
html_formdata = requests.post('网址',data=data).content.decode()
#data的内容和项数可以根据实际情况修改,如何构造该字典是设计爬虫的任务之一.

还有一些网站,提交的内容是需要JSON格式的,因此post()方法的参数需要进行一些修改.

import reuqests
data = {'key1':'value1','key2':'value2'}
html_json = requests.post('网址',json=data).content.decode()
#这样,requests会自动将字典转换成JSON字符串,使用JSON提交数据
  • 🌿Requests和正则表达式应用举例
    网站的HTML文件:
    在这里插入图片描述
    示例代码:
    在这里插入图片描述

🔑多线程爬虫
若爬虫只有一个进程、一个线程,则该爬虫被称为单线程爬虫.
单线程爬虫每次脂肪纹一个页面,不能充分利用计算机的网络带宽.一个页面最多也就几百KB,因此,若爬虫只爬取一个页面,则将浪费多余的网络带宽和从发起reuqest到收到response之间的时间.
如果一个爬虫可以同时访问多个页面,其爬取速度将会得到显著提高.为了达到这个目的,需要使用多线程爬虫.
Python的多线程都是伪多线程
Python是解释型语言,其解释器被一个全局解释器锁(Global Interpreter Lock)保护,使其在任何时候实际都只有一个线程在运行.因此,对于CPU密集型的程序而言,影响较大.
爬虫属于I/O密集的程序,使用多线程可以大大提高爬虫的效率.

  • 🌿Multiprocessing库
    Multiprocessing本身是Python的多进程库,用来处理与多进程相关的操作.
    由于进程和线程之间不能直接共享内从和堆栈资源,而且启动新的进程开销也比线程大得多,因此,使用多线程来爬取比使用多进程有更多的优势.
    Multiprocessing下面有一个dummy模块,dummy下面有一个Pool类,用来实现线程池.这个线程池有一个map()方法,可以让线程池里面的所有线程都"同时"执行一个函数.
  • 🌿单线程与多线程爬取网页比较
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    如果线程池设置得过大,线程切换导致的开销可能会抵消多线程带来的性能提升,在具体的应用场景下设置不同的大小进行测试对比,找到一个最合适的数据.

💡爬虫常见的搜索算法

  • 深度优先搜索(DFS)
    沿着树的深度遍历树的节点,直到所有节点都被访问为止.
  • 广度优先搜索(BFS)
    沿着树的宽度遍历树的节点,直到所有节点都被访问为止.
  • 选择策略
    根据被爬取的数据来进行选择,变化量小的优先.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章