网络爬虫—01爬虫入门

一、通用爬虫和聚焦爬虫

根据使用场景,网络爬虫可分为:通用爬虫 和 聚焦爬虫两种

1、通用爬虫

  • 通用网络爬虫是捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分。
  • 主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。
  • 通用网络爬虫 从互联网中搜集网页,采集信息,这些网页信息用于为搜索引擎建立索引从而提供支持,它决定着 整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果。

通用爬虫基本工作流程

在这里插入图片描述
搜索引擎如何获取一个新网站的URL:

  1. 新网站向搜索引擎主动提交网址:
  2. 在其他网站上设置新网站外链
  3. 和DNS解析服务商(如DNSPod等)合作,新网站域名将被迅速抓取

搜索引擎蜘蛛的爬行是被输入了一定的规则的,它需要遵从一些命令或文件的内容。

  • rel=“nofollow”,,告诉搜索引擎爬虫无需抓取目标页,同时告诉搜索引擎无需将的当前页的Pagerank传递到目标页.
  • Robots协议(也叫爬虫协议、机器人协议等),全称是“网络爬虫排除准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

在这里插入图片描述

通用爬虫的局限性

  • 大多情况下,网页里90%的内容对用户来说都是无用的。
  • 搜索引擎无法提供针对具体某个用户的搜索结果。
  • 图片、数据库、音频、视频多媒体等不能很好地发现和获取。
  • 基于关键字的检索,难以支持根据语义信息提出的查询,无法准确理解用户的具体需求。

2.聚焦爬虫

聚焦爬虫,是 “面向特定主题需求” 的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于:聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。
这里重点要学习的就是聚焦爬虫。

二、HTTP和HTTPS

HTTP协议-80端口:
HyperTextTransferProtocol, 超文本传输协议是一种发布和接收HTML页面的方法。
HTTPS-443端口:
HypertextTransferProtocoloverSecureSocketLayer, 简单讲是HTTP的安全版,在HTTP下加入SSL 层。
在这里插入图片描述

HTTP工作原理

网络爬虫抓取过程可以理解为模拟浏览器操作的过程。
在这里插入图片描述
浏览器发送HTTP请求的过程:
(1)当用户在浏览器地址栏中输入一个URL并按回车键后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“GET”和“POST”两种方法
(2)当我们在浏览器输入URL,比如http://www.baidu.com的时候,浏览器发送一个Request请求去获取http://www.baidu.com的html文件,服务器把Response文件对象发送回给浏览器。
(3)浏览器分析Response中的HTML,发现其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。
(4)当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。

这里要重点理解,当用户输入一个URL后,发生了什么:
简单的说:
一、浏览器获取资源的过程:
1、输入url
2、浏览器解析url,获得主机名
3、将主机名转换成服务器ip地址(查找本地DNS缓存列表,如果没有则向默认的DNS服务器发送查询请求)
4、浏览器建立一条与服务器的TCP连接(三次握手)
5、浏览器向服务器发送http请求
6、服务器向浏览器返回请求响应
7、浏览器关闭连接,并解析文档
8、如果文档中有资源,则重复6/7/8
二、浏览器渲染页面的过程:
1、html生成dom tree
2、css生成 style rules
3、dom 树与style rules 结合生成render tree
4、布局:计算每个节点的信息
5、绘制:根据计算的信息,渲染页面
来自:https://www.cnblogs.com/annie211/p/10737766.html
详细过程参考:https://www.cnblogs.com/Jayyu/p/11633587.html

URL(Uniform/UniversalResourceLocator的缩写):统一资源定位符,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。

基本格式: scheme://host[:port#]/path/…/[?query-string][#anchor]

query-string:参数,发送给http服务器的数据
anchor:锚(跳转到网页的指定锚点位置)

在这里插入图片描述

三、客户端HTTP请求

客户端发送一个HTTP请求到服务器的请求消息,包括以下格式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法.
HTTP0.9:只有基本的文本GET功能。
HTTP1.0:完善的请求/响应模型,并将协议补充完整,定义了三种请求方法:GET,POST和HEAD方法
HTTP1.1:在1.0基础上进行更新,新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。

在这里插入图片描述
重点理解GET和POST方法

  1. GET是从服务器上获取数据,POST是向服务器传送数据
  2. GET请求参数显示,都显示在浏览器网址上,即“Get”请求的参数是URL的一部分。
  3. POST请求参数在请求体当中,消息长度没有限制而且以隐式的方式进行发送,通常用来向HTTP服务器提交量比较大的数据(比如请求中包含许多参数或者文件上传操作等),请求的参数包含在“Content-Type”消息头里,指明该消息体的媒体类型和编码,

常用的请求报头

在这里插入图片描述

请求报头含义
Host主机和端口号
Connection客户端与服务连接类型, 默认为keep-alive
User-Agent客户浏览器的名称
Accept浏览器或其他客户端可以接受的MIME文件类型
Referer表明产生请求的网页来自于哪个URL
Accept-Encoding指出浏览器可以接受的编码方式。
Accept-Language语言种类
Accept-Charset字符编码
Cookie浏览器用这个属性向服务器发送Cookie
Content-TypePOST请求里用来表示的内容类型

在这里插入图片描述
在这里插入图片描述

四、HTTP响应

HTTP响应由四个部分组成,分别是: 状态行 、 消息报头 、 空行 、 响应正文
在这里插入图片描述

响应状态码

在这里插入图片描述
200: 请求成功
302: 请求页面临时转移至新url
307和304: 使用缓存资源
404: 服务器无法找到请求页面
403: 服务器拒绝访问,权限不够
500: 服务器遇到不可预知的情况

Cookie和Session

服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。
Cookie:通过在客户端记录的信息确定用户的身份。
Session:通过在服务器端记录的信息确定用户的身份。

在这里插入图片描述

五、简单案例:图片下载器

制作爬虫的基本步骤

  1. 需求分析: http://image.baidu.com/search/index?tn=baiduimage&word=cat
  2. 分析网页源代码,配合F12
  3. 编写正则表达式或者其他解析器代码
  4. 存储数据到本地
  5. 正式编写python爬虫代码

需求分析:想要某个网站的图片,不用自己去搜索,还能自动下载
网页分析:在这里插入图片描述

import os
import re
from colorama import Fore  # 打印时加字体颜色
import requests

def download_image(url, keyword):
    """下载图片"""

    # 1. 向服务器(百度)发起HTTP请求
    response = requests.get(url)  # 返回一个响应

    # 2. 获取服务器端的响应信息
    # print(response)     # 200  成功
    # print(dir(response))  # 有哪些方法
    # print(response.text)
    data = response.text

    # 3. 编写正则表达式,获取图片的网址
    #   从源代码里找  找图片的网址 ,不是单纯的html,要看源代码
    #  . 除了\n之外的任意字符  * 前一个字符出现0次或者无数次  ? 非贪婪模式
    # {"ObjURL":"http:\/\/img1.imgtn.bdimg.com\/it\/u=2384096151,2805439088&fm=214&gp=0.jpg
    pattern = r'"ObjURL":"(.*?)"'  # ()分组
    #这里面的 \ 是转义字符   将 \\ 替换为''
    # 转义字符 : \n, \t, \ , \\

    # 4. 根据正则表达式寻找符合条件的图片网址
    image_urls = re.findall(pattern, data)[:3]  # re: 正则表达式
    # print(image_urls[:3])

    # 5. 下载猫的图片到本地,存到本地文件
    index = 1
    for image_url in image_urls:
        # response.text 返回unicode 的文本信息
        # response.text 返回bytes 类型的信息
        image_url = image_url.replace('\\','')

        try:
            response = requests.get(image_url)
            # print(image_url)
            # http://img3.imgtn.bdimg.com/it/u=2072494435,853546208&fm=26&gp=0.jpg
        except Exception as e :
            print(Fore.RED + '下载失败: %s' %(image_url))
        else:
            # 有的图片后缀名时 .png 其他格式  不是.jpg
            old_image_filename = image_url.split('/')[-1]  # 按/分割,取最后一个,也就是图片名称
            if old_image_filename:                # 如果存在
                image_format = old_image_filename.split('.')[-1]  # 按.分割,取最后一个,也就是图片格式
                if '?' in image_format:
                    image_format = image_format.split('?')[0]
            else:
                image_format = 'jpg'

            #生成图片的存储目录
            keyword = keyword.replace(' ', '_')
            if not os.path.exists(keyword):
                os.makedirs(keyword)
            # image_filename = os.path.join('download_images', str(index) + '.' + image_format)
            image_filename = os.path.join(keyword, str(index) + '.' + image_format)

            with open(image_filename, 'wb') as f:
                f.write(response.content)
                print(Fore.BLUE + '保存图片%s.jpg成功' % (index))
                index += 1


if __name__ == '__main__':
    keyword = input('请输入批量下载图片的关键字:')
    url ='http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word='+keyword
    print(Fore.RED + '[+]正在请求网址:%s' %(url))
    download_image(url,keyword)

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值