Skr-Eric的爬虫课堂(三)——爬虫的模拟登陆、requests模块、get()中参数和Handler处理器

Cookie模拟登陆

  1、什么是cookie、session

    HTTP是一种无连接协议,客户端和服务器交互仅仅限于 请求/响应 过程,结束后断开,下一次请求时,服务器会认为是一个新的客户端,为了维护他们之间的连接,必须在一个地方保存客户端信息

    cookie :通过在客户端记录的信息确定用户身份

    session:通过在服务端记录的信息确定用户身份

  2、案例 :利用Cookie模拟登陆人人网

    1、一定要先登录成功1次,获取到cookie

 

requests模块

  1、get(url,params=params,headers=headers)

    params: 查询参数,字典,不用编码,也不用拼接URL

  2、响应对象res的属性

    1、encoding : 响应字符编码,res.encoding="utf-8"

    2、text     : 字符串

    3、content  : 字节流

    4、status_code : 响应码

    5、url      : 返回实际数据的URL

  3、非结构化数据存储

    html = res.content

    with open("XXX","wb") as f:

        f.write(html)

  4、post(url,data=data,headers=headers)

    1、data :Form表单数据,字典,不用编码,不用转码

    2、有道翻译

      # 此处data为form表单数据

      res = requests.post(url,data=data,headers=headers)

      res.encoding = "utf-8"

      html = res.text

 

get()方法中不同参数

  1、代理IP(参数名: proxies)

    1、获取代理IP的网站

      西刺代理IP

      快代理

      全网代理

    2、普通代理

      1、格式 :proxies={"协议":"协议://IP地址:端口号"}

        http://httpbin.org/get : 能够显示客户端的headers和IP

       proxies = {"HTTP":"http://61.152.248.147:80"}

    3、私密代理

      1、格式

        proxies = {"http":"http://用户名:密码@IP地址:端口号"}

    4、链家二手房案例(MySQL数据库)

import requests
import re
import pymysql

class LianjiaSpider:
    def __init__(self):
        self.baseurl = "https://bj.lianjia.com/ershoufang/pg"
        self.headers = {"User-Agent":"Mozilla/5.0"}
        self.proxies = {"http":"http://309435365:szayclhp@116.255.162.107:16816"}
        self.page = 1
        self.db = pymysql.connect("localhost",
                          "root","123456","lianjia",
                          charset="utf8")
        self.cursor = self.db.cursor()

    def getPage(self,url):
        res = requests.get(url,proxies=self.proxies,headers=self.headers)
        res.encoding = "utf-8"
        html = res.text
        print("页面获取成功,正在解析...")
        self.parsePage(html)

    def parsePage(self,html):
        p = re.compile('<div class="houseInfo">.*?data-el="region">(.*?)</a>.*?<div class="totalPrice">.*?<span>(.*?)</span>',re.S)
        r_list = p.findall(html)
        # r_list : [("富力城","500"),(),()]
        print("解析成功,正在存入数据库...")
        self.writeTomysql(r_list)

    def writeTomysql(self,r_list):
        ins = 'insert into house(name,price) \
               values(%s,%s)'
        for r in r_list:
            L = [r[0].strip(),
                 float(r[1].strip())*10000]
            self.cursor.execute(ins,L)
            self.db.commit()
        print("存入数据库成功")

    def workOn(self):
        while True:
            c = input("爬按y,退出q:")
            if c == "y":
                url = self.baseurl + \
                      str(self.page) + "/"
                self.getPage(url)
                self.page += 1
            else:
                self.cursor.close()
                self.db.close()
                break

if __name__ == "__main__":
    spider = LianjiaSpider()
    spider.workOn()

      1、找URL

        第1页:https://bj.lianjia.com/ershoufang/pg1/

       第2页:https://bj.lianjia.com/ershoufang/pg2/

      2、正则

        <div class="houseInfo">.*?data-el="region">(.*?)</a>.*?<div class="totalPrice">.*?<span>(.*?)</span>

      3、写代码

    5、链家二手房案例(MongoDB数据库)

import requests
import re
import pymongo

class LianjiaSpider:
    def __init__(self):
        self.baseurl = "https://bj.lianjia.com/ershoufang/pg"
        self.headers = {"User-Agent":"Mozilla/5.0"}
        self.proxies = {"http":"http://309435365:szayclhp@116.255.162.107:16816"}
        self.page = 1
        # 连接对象
        self.conn = pymongo.MongoClient("localhost",27017)
        # 库对象
        self.db = self.conn["lianjia"]
        # 集合对象
        self.myset = self.db["house"]

    def getPage(self,url):
        res = requests.get(url,proxies=self.proxies,headers=self.headers)
        res.encoding = "utf-8"
        html = res.text
        print("页面获取成功,正在解析...")
        self.parsePage(html)

    def parsePage(self,html):
        p = re.compile('<div class="houseInfo">.*?data-el="region">(.*?)</a>.*?<div class="totalPrice">.*?<span>(.*?)</span>',re.S)
        r_list = p.findall(html)
        # r_list : [("富力城","500"),(),()]
        print("解析成功,正在存入数据库...")
        self.writeTomongo(r_list)

    def writeTomongo(self,r_list):
        for r in r_list:
            D = {
                "name":r[0].strip(),
                "price":float(r[1].strip())*10000
                }
            self.myset.insert(D)
        print("存入数据库成功")

    def workOn(self):
        while True:
            c = input("爬按y,退出q:")
            if c == "y":
                url = self.baseurl + \
                      str(self.page) + "/"
                self.getPage(url)
                self.page += 1
            else:
                break

if __name__ == "__main__":
    spider = LianjiaSpider()
    spider.workOn()

      >>>show dbs

      >>>use 库名

      >>>show collections

      >>>db.集合名.find().pretty()

      >>>db.集合名.count()

  2、Web客户端验证(参数名:auth=(元组))

  3、SSL证书认证(参数名:verify=True | False)

    1、verify = True :默认,进行SSL证书认证

    2、verify = False:不做认证

 

urllib.request中Handler处理器

  1、定义

    自定义的urlopen()方法,因为模块自带的urlopen不支持代理等功能,通过Handler处理器自定义urlopen方法

  2、常用方法

    1、opener = build_opener(某种功能Handler处理器对象)

    2、opener.open(url)

  3、使用流程

    1、创建相关的Handler处理器对象

    2、创建自定义opener对象

    3、利用opener对象的open方法发请求获响应

  4、Handler处理器分类

    1、HTTPHandler() :没有特殊功能

    2、ProxyHandler({普通代理})

       代理格式 :{"":""}

    3、ProxyBasicAuthHandler(密码管理器对象)

    4、HTTPBasicAuthHandler(密码管理器对象)

  5、密码管理器用途

    1、私密代理

    2、Web客户端认证

    3、程序实现流程

      1、创建密码管理对象

        pwdmg = urllib.request.HTTPPasswordMgrWithDefaultRealm()

      2、把认证信息添加到对象里面去

       pwdmg.add_password(None,Webserver,user,password)

      3、创建Handler处理器对象

      proxy_handler = urllib.request.ProxyBasicAuthHandler(pwdmg)

      4、创建自定义opener对象

       opener = urllib.request.build_opener(proxy_handler)

      5、利用opener对象的open方法发请求获响应

        req = urllib.request.Request(url,headers=headers)

        res = opener.open(req)

 

 

 

想要看更多的课程请微信关注SkrEric的编程课堂

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值