• 爬虫基本原理


    爬虫定义

    请求网站并提取数据的自动化程序

    爬虫的基本流程

    1、发起请求:通过http库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应

    2、获取响应内容:如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有html,json字符串,二进制数据(如图片视频)等类型

    3、 解析内容:得到的内容可能是html,可以用正则表达式,网页解析库进行解析,可能是json,可以直接转为json对象进行解析,可能是二进制数据,可以做保存或者进一步的处理

    4、保存数据:保存形式多样,可以存为文本,也可以保存至数据库,或者保存特定格式的文件

    Request和Response

    1、浏览器发送消息给该网址所在的服务器,这个过程叫做HTTP Request。

    2、服务器收到浏览器发送额消息后,能够根据浏览器发送消息的内容,做相应处理,然后把消息回传给浏览器,这个过程叫做HTTP Response。

    3、浏览器收到服务器的Response信息后,会对信息进行相应处理,然后展示出来。

    上述就是request和response的一个流程。

    Request中包含的内容

     1、请求方式

    主要有get,post两种类型,另外还有head,put,delete,options等

    get请求的一些参数全都包含在网址里面

    post请求的参数没有在url中,get直接输入网址即可,post需要构造一个表单(如账号登陆等)

    2、请求url

    url全称统一资源定位符,如一个网页文档,一张图片,一个视频等都可以用url来唯一确定

    3、请求头

    包含请求时的头部信息(键值对的形式),如user-agent(服务器会根据这个信息识别是什么样的浏览器,有时候不加user-agent,服务器就会判断为非法信息,可能就不会返回响应),host,cookies等信息

    一般做爬虫的时候会加上这个RequestHeaders,以保证我们的请求可以正常运行

    4、请求体

    请求时额外携带的数据,如表单提交时的表单数据等

    一般来说get方式时,不会携带任何内容,post方式时,请求体会包含一些内容

    Reponse中包含的内容

    1、响应状态

    有多种响应状态,如200代表成功,301跳转,404找不到页面,502服务器错误

    2、响应头

    如内容类型,内容长度,服务器信息,设置cookie等等

    3、响应体

    最主要的部分,包含额请求资源的内容,如网页html,图片二进制数据等

    在做爬虫的时候,通过请求库向服务区发送一个请求,得到响应,通过过解析库进行解析,获得想要的数据

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import requests
    response = requests.get('http://www.baidu.com')
    print(response)
    print(response.text)
    

    输出结果为:

    print(response)返回请求的状态码

    print(response.text)返回请求体的内容(网页源代码) 

    响应除了响应体还有状态码和响应头

    print(response.headers),打印响应头

    print(response.status_code),打印响应状态码

    在上面的请求过程中,没有传递请求头,下面加上请求头

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import requests
    headers = {
       'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134'}
    response = requests.get('http://www.baidu.com',headers = headers)
    print(response)
    print(response.text)
    print(response.headers)
    print(response.status_code)
    

    爬虫可以抓取什么样的数据

    1、网页文本

    如html文档,Json格式文本等

    2、图片

    获取到的是二进制文件,保存为图片格式

    import requests
    
    response = requests.get('https://sp1.baidu.com/5b1ZeDe5KgQFm2e88IuM_a/wb.gif?type=3&fm=flow_monitor&data=[{}]&q=ͼƬ&qid=b2fbcee5000379bd&rsv_did=9d9d61fd41713df8088b4a20c03b3fd8&rsv_tn=baidu&rsv_sid=26525_1441_21106_26350_26432_26578_22157&t=1528443263126')
    print(response.content)
    with open('picture.jpeg','wb') as f:
        f.write(response.content)
    

    request.get()中的内容是一个图片的url

    rsponse.content与text不一样,content是获取二进制内容

    最后将获取到的二进制数据写入文件,保存为图片格式即可

    3、视频

    同为二进制文件,保存为视频格式即可

    与图片操作一样

    4、其他

    只要是能请求到的,都能获取

    解析方式

    1、直接处理

    比如网页比较简单,返回的内容也简单,就一个字符串,就相当于对字符串做处理了

    2、Json解析

    有些网页的数据是通过ajax来加载的,这种返回的通常是一些json格式的字符串

    3、正则表达式

    应用比较普遍

    4、BeautifulSoup

    比正则表达式更方便,提取更容易

    5、其他的解析库,如PyQuery,XPath等

     为什么抓到的数据和浏览器中看到的不一样

    我们拿到的是后台请求的源代码,跟渲染之后的网页源代码是不一样的

    一个在network中,一个在elements中

    如何解决JavaScript渲染的问题

    1、分析Ajax请求

    2、用Selenium或WebDriver驱动一个浏览器来加载一个网页

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get('http://www.baidu.com')
    

     使用driver.pagesource就可以查看网页的源代码了,不用担心javascri渲染的问题了

    3、splash

    跟selenium一样,也是来模拟javascript渲染的

    4、PyV8,Ghost.py等库来模拟加载

    怎样保存数据

    1、保存为文本形式

    纯文本,Json,XML等

    2、关系型数据库

    如MySQL,Oracle,SQL Server等具有结构化表结构形式存储

    3、非关系型数据库

    如MongoDB,Redis等key-value形式存储

    4、二进制文件

    如图片、视频、音频等等直接保存成特定格式即可

    三样东西有助于缓解生命的疲劳:希望、睡眠和微笑。---康德
  • 相关阅读:
    进程间的通讯(IPC)方式
    进程间通信IPC之--共享内存
    TMDS协议
    HDMI接口与协议
    HDMI的CEC是如何控制外围互联设备的
    SVN并行开发管理策略
    关于 javascript event flow 的一个bug
    H面试程序(15): 冒泡排序法
    android应用如何启动另外一个apk应用
    [置顶] 一份诚恳的互联网找工作总结和感想(附:怎样花两年时间去面试一个人)
  • 原文地址:https://www.cnblogs.com/ronghe/p/9155217.html
Copyright © 2020-2023  润新知