zoukankan      html  css  js  c++  java
  • 初识爬虫

    爬虫概念
    什么是爬虫
    爬虫是一个应用程序
    是指某一个用于爬取数据的应用程序
    爬取的目标可以使整个互联网 也可以是单独的某一个服务器
    在CS结构中 爬虫属于client 客户端

    爬虫的价值 :
    互联网中最有价值的就是数据
    爬虫中首要任务就是要通过网络取获取模板服务器的数据;来为自己创造价值

    爬虫的流程:
    首先明确 我们的爬虫是客户端 要爬的数据在服务器上存储,
    所以需要借助网络编程,底层的网络协议已经有现成的封装不需要自己写,
    数据传输已经解决,问题是对方给我的数据我能不能看懂 我的数据对方能不能看懂
    绝大多数网络传输都是采用的HTTP(*****)

    HTTP 协议 超文本传输协议


    1.明确要爬取的url地址


    2.发送请求
    浏览器发送请求
    第三方requests模块 pip install requests
    内置的urllib模块
    selenium (自动化测试模块)用程序驱动浏览器发送请求
    之所以用selenium是因为一些网站需要人机交互(点击,拖拽等等操作)

    针对移动app可以使用代理服务器 可以截获app端发送的请求信息 Charles(青花瓷)


    3.接收响应
    浏览器接受相应后会渲染页面进行展示 无法拿到数据 所以更多情况下使用用浏览器来分析请求详情
    requests和urllib都会直接返回响应体
    selenium 提供了find_element***的接口用于获取数据


    4.解析数据
    re
    BeautifulSoup 封装了常用的正则表达式
    移动端返回的/ajax返回的json数据 直接json.load


    5.存储数据
    mysql等 关系型数据库
    MongoDB redis 非关系型数据库 一般用在高并发爬虫中


    接口测试工具postman paw(mac 可以自动生成请求代码)

    Scrapy爬虫框架

    import requests
    
    
    key = input("请输入关键字:")
    
    
    # 手动进行中文编码
    #from urllib.parse import urlencode
    #print(urlencode({"wd":key},encoding="utf-8"))
    
    
    url = "https://www.baidu.com/s"     #url地址获取
    
    
    user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
    #模拟浏览器带上版本
    resp = requests.get(url,
                 params={"wd":key},
                 headers = {"User-Agent":user_agent})
    
    
    
    with open("baidu.html","wb") as f:
        f.write(resp.content)
        #print(resp.text)
    小试牛刀 抓取下百度搜索页面,

    #注意 先要安装 pip3 install requests 模块

    """
    1.获取token
    地址:https://github.com/login
    token放在了响应体中
    
    
    """
    import requests,re
    # 1.获取token
    login_page_url = "https://github.com/login"
    resp = requests.get(login_page_url) # 请求首页
    # 获取返回的cookie
    cookie = resp.cookies.get_dict()
    token = re.search('authenticity_token" value="(.*?)" /> ',resp.text).group(1) # 获取token
    
    
    
    
    
    # 2.请求登录接口
    login_url = "https://github.com/session"
    resp2 = requests.post(login_url,
                  headers={
                      "Referer": "https://github.com/login",
                      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
                  },
                  data={"commit": "Sign in",
                        "utf8": "",
                        "authenticity_token": token,
                        "login": "oldboyedujerry",
                        "password": "123654asdAsd",
                        "webauthn-support": "supported"},
                  cookies = cookie)
    #data 是post 发送请求带上用户名,密码等信息发送上去
    print(resp2.status_code)        #查看状态吗
    with open("github_home.html","wb") as f:
        f.write(resp2.content)
    print("oldboyedujerry/testProject" in resp2.text)
    模拟登录带有cookie与session的页面方法
    import requests
    
    # 最常用的两个函数
    # requests.get()
    # requests.post()
    
    
    url = "https://www.baidu.com/s"
    
    resp = requests.get(url,params={"wd":"egon"},headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3538.77 Safari/537.36"})
    
    print(resp.text)              #显示是文档形式的
    print(resp.content)           #显示是二进制形式,用于存视频,图片等
    print(resp.status_code)       #显示的是状态码
    print(resp.url)               #显示url地址出来
    print(resp.cookies) # 获取返回的cookies信息
    print(resp.cookies.get_dict()) # 获取返回的cookies信息
    # print(type(resp.json()))# 将结果进行反序列化
    print(resp.request) # 请求方式
    从文档中获取编码方式
    print(resp.apparent_encoding)
    print(resp.encoding)
    print(resp.headers) # 查看响应头
    print(resp.history) # 重定向历史   即前一次请求的地址
    print(resp.url) # 当前地址
    requests的属性
    # 对于返回值为json格式的处理
    
    # jsonresp = requests.get("http://v.juhe.cn/toutiao/index?key=1f1ed574dda497de207ccca4d9999d7f")
    #
    # print(type(jsonresp.text))
    # print(type(jsonresp.json()))
    #
    # print(jsonresp.json())
    # 代理池  ********   对于爬虫而言是相当重要的一个参数
    # ps = ["121.228.240.101:9999","121.228.240.101:9999","121.228.240.101:9999","121.228.240.101:9999"]
    # import random
    # # 使用代理服务器请求
    # resp = requests.post("http://news.baidu.com/?tn=news",proxies={"HTTP":random.choice(ps)})
    # with open("ttt.html","wb") as f:
    #     f.write(resp.content)
    # print(resp.text)
    使用Ip代理池的方式,爬取数据
    import requests

    # 给服务器传参数
    # requests.get("url",params={"key":'value'})

    # post请求 data和json都能传参数
    # requests.post("url",data={"name":"jerry","pwd":"123"},json={"name":"jerry","pwd":"123"})
    # data 拼接为:name=jerry&pwd=123
    # json 直接序列化成字符串 {"name":"jerry","pwd":"123"}


    # 超时时间 第一个表示连接超时时间 2表示响应超时时间
    # requests.post("https://www.baidu.com",timeout=(10,10))
  • 相关阅读:
    MySQL数据库的常用命令
    MySQL数据库的概念
    Linux磁盘管理
    linux账号与权限管理
    安装及管理程序
    vi编辑器+常用命令
    centos7下部署elasticsearch7.2集群--Elastic Stack之一
    打开virt-manager界面显示方格乱码
    Rabbitmq之修改日志和数据存放路径
    Rabbitmq之Memory
  • 原文地址:https://www.cnblogs.com/gukai/p/10712945.html
Copyright © 2011-2022 走看看