Python——爬虫基础

通用爬虫

1.通用爬虫和聚焦爬虫
根据实用场景,网络爬虫可分为通用爬虫和聚焦爬虫两种。

通用爬虫是搜索引擎抓取系统的重要组成部分。主要是将互联网上的网页下载到本地,形成一个互联网内容的景象备份。
在这里插入图片描述
通用爬虫从互联网中搜集网页,采集信息,这些网页信息用于为搜索引擎建立索引提供支持,它决定着整个搜索引擎的内容是否丰富,信息是否及时,因此其性能的优劣直接影响着搜索引擎的效果。

爬虫基本原理工作流程图
在这里插入图片描述
问:搜索引擎如何获取一个新网站的URL?
答:
1.新网站向搜索引擎主动提交网址:
2.在其他网站上设置新网站外挂
3.和DNS解析服务商(如何DNSPod等)合作,新网站域名将被迅速抓取。

2.爬虫限制
搜索引擎蜘蛛的爬行是被输入了一定的规则的,它需要遵从一些命令或者文件的内容。
(1).rel=‘nofollow’,告诉搜索引擎爬虫无需抓取目标页,同时告诉搜索引擎无需将当前页的Pagerank传递到目标页。
(2).Robots协议,也被称为机器人协议,爬虫协议,全称是网络爬虫排除标准,网站通过该协议告诉搜索引擎哪些页面可以抓取,那些页面不能抓取
在这里插入图片描述
3.局限性:
1.大多情况下,网页里%90的内容对用户来说都是没有用的。
2.搜索引擎无法提供针对具体某个用户的搜索结果。
3.图片、数据库、音频、视频多媒体等不能很好地发现和获取。
4.基于关键字的检索,难以支持根据与一信息提出的查询,无法准确理解用户的具体需求。

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

我们要学习的,就是聚焦爬虫。

HTTP和HTTPS

HTTP和HTTPS:
HTTP协议-80端口
HyperTextTransferProtocol, 超文本传输协议是一种发布和接收HTML页面的方法。
HTTPS-443端口
HypertextTransferProtocoloverSecureSocketLayer, 简单讲是HTTP的安全版,在HTTP下加入SSL 层。
在这里插入图片描述
HTTP工作原理:
网络爬虫抓取过程可以理解为模拟浏览器操作的过程。
在这里插入图片描述
URL
URL:统一资源定位符,是用于完整的描述internet上网页和其它资源的地址的一种表示方法。
基本格式: scheme://host[:port#]/path/…/[?query-string][#anchor]
在这里插入图片描述

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

客户端HTTP请求

浏览器发送HTTP请求的过程:
1.当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为’Get‘和’Post‘两种方法。
2.当我们在浏览器输入一串URL地址的时候,浏览器会发送一个Request请求去获取该地址的html文件,服务器把Response文件对象发送回给浏览器。
3.浏览器分析Response中的HTML,发现其中引用了很多其他文件,比如mages文件,CSS文件,JS文件。浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。
4.当所有的文件都下载成功后,网页会根据HTML语法结构,完整的展示出来。

客户端发送一个HTTP请求到服务器的请求消息,包括以下格式:
在这里插入图片描述
在这里插入图片描述
请求方法Method
根据HTTP标准,HTTP请求可以使用多种请求方法
HTTP9.0:只有基本的文本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请求参数在请求体当中,消息长度没有限制而且以隐式的方法进行发送,通常用来向服务器提交量比较大的数据,请求的参数包含在‘Content-Type’消息头里,指明该消息体的媒体类型和编码。

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

HTTP响应

HTTP响应由四个部分组成,分别是:状态行、消息报头、空行、响应正文。
在这里插入图片描述
状态响应码:在这里插入图片描述
200:请求成功
320:请求页面临时跳转至新的url
307和304:使用缓存资源
404:服务器无法找到请求页面
403:服务器拒绝访问,权限不足
500:服务器遇到不可预知的情况

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

图片下载器

制作爬虫的基本步骤:

  1. 需求分析
  2. 分析网页源代码,配合F12
  3. 编写正则表达式或者其他解析器代码
  4. 正式编写python爬虫代码

分析网页:
在这里插入图片描述
在这里插入图片描述
爬虫代码:

import re
import requests
import os
def downloadPic(html, keyword):
    """

    :param html: 页面的源代码
    :param keyword: 搜索的关键字
    :return:
    """
    # (.*?)代表任意多个字符
    # ()代表分组,值返回符合条件的字符串中括号里面的内容
    pic_url = re.findall('"objURL":"(.*?)",', html, re.S)[:5]
    count = 0
    print("找到关键字:" + keyword + '的图片,现在开始下载图片...')
    # each是每个图片的url地址
    for each in pic_url:
        print("正在下载第" + str(count + 1) + '张图片,图片地址:' + str(each))
        try:
            headers = {'User-Agent': 'Mozilla/5.0(Linux;Android 6.0;Nexus 5 Build/HRA8N)'
                                     'AppleWebKit/537.36(KHTML,like Gecko)Chrome/59.0.3071.109'
                                     'Mobile Safari/537.36'}
            # 获取指定图片的相应对象:
            response = requests.get(each, timeout=10, headers=headers)
        except requests.exceptions.ConnectionError:
            print("[错误]当前图片无法下载")
            continue
        except Exception as e:
            print("[错误]当前图片无法下载")
            print(e)
            continue
        else:
            if response.status_code != 200:
                print('访问失败:', response.status_code)
                continue
        # *************存储图片到本地***************
        if not os.path.exists(imgDir):
            print('正在创建目录', imgDir)
            os.makedirs(imgDir)
        posfix = each.split('.')[-1]
        if posfix not in ['png', 'jpg', 'gif', 'jpeg']:
            break
        print('正在下载第' + str(count + 1) + '张图片,图片地址:' + str(each))
        name = keyword + '_' + str(count) + "." + posfix
        filename = os.path.join(imgDir, name)
        count += 1
        with open(filename, 'wb') as f:
            f.write(response.content)


if __name__ == '__main__':
    imgDir = 'pictures'
    word = input("Input your key word:")
    url = 'http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=nba'
    try:
        response = requests.get(url)
    except Exception as e:
        print(e)
        content = ''
    else:
        content = response.text

    downloadPic(content, word)

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值