python 爬虫day02

cookies和session

  • 什么是cookies和session
    1.主要解决HTTP协议无连接、无状态的特点,使服务器能够识别用户
    2.cookies是保存在客户端的一组识别信息(例如会员卡),session是存在服务器端的数据
    3.cookies和session通过seesionid关联
    4.当客户机登录成功后,关闭了相关页面,一段时间以内(没有到超时时间)再次访问相关网页,浏览器会自动携带相应的cookies信息,并发送给服务器(cookies中携带sessionid),服务器检查相应sessionid的超时状态,如果没有超时,按照已登录提供服务

  • 使用浏览器cookies实现免登录

    1.Set-Cookie 服务器发给客户端,用来设置客户端Cookie内容(在响应头中)

    2.Cookie 是客户端发给服务器,用来向服务器表明身份(在请求头中)

    怎么选择:优先使用Set-Cookie,如果Set-Cookie不生效,尝试不同页面的Cookie

    http_header = {

      "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0",
      "Cookie":"PHPSESSID=ST-36136-BRPAZ-fhqyWyq9jNsVHoyhGrRPA-izm5ejd5j1npj2pjc7i3v4z" #通过浏览器查看元素在响应头中获取cookie信息
    

    }

    response = requests.get(“http://jx.1000phone.net/”,headers=http_header)
    print(response.text)

  • 构建session模拟浏览器流程实现免登录

    #模拟浏览器cookie

    #获取requests的Session会话,只要程序不结束,session中的cookie一直存在(在有效期内)
    s = requests.session()

    #构建登录信息结构
    post_data = {}
    post_data[‘Account’] = “”
    post_data[‘PassWord’] = “”

    #使用Post登录
    response = s.post(“http://stu.1000phone.net/student.php/Public/login”,data=post_data)
    print(response.status_code)

    #打印session中包含的cookie内容
    print(s.cookies.get_dict())

    #带着登录信息访问其他后台页面,这里可以使用Get
    response = s.get(“http://stu.1000phone.net/student.php/Index/problem”)
    print(response.text)

  • 如何使用代理
    1.基本使用

    #proxies是代理池,使用key:value形式存放代理,Key是协议类型,value是具体的代理IP和端口号,推荐使用高匿代理
    proxies = {“http”:“http://61.135.217.7:80”}
    requests.get(“http://www.baidu.com”,proxies=proxies)

    2.如何构建代理池
    - 爬取代理网站所有代理连接
    - 抽取相应代理地址
    - 测试代理地址是否可用(包括测试连通性及访问内容)
    - 测试通过放入代理池

  • URL的构成
    1.如何解析一个url(统一资源定位符)

    #urlparse用于解析网址
    from urllib.parse import urlparse
    #解析结果是ParseResult(scheme=‘http’, netloc=‘www.baidu.com’, path=’/test/python’, params=’’, query=‘name=jack&age=19’, fragment=‘frag’)
    parse_result = urlparse(“http://www.baidu.com/test/python?name=jack&age=19#frag”)
    print(parse_result.netloc)

2.什么是url编码(urlencode)

为了防止字符中(主要是汉字)的特殊编码和http协议中的保留字符相冲突,必须对参数中的非ascii字符进行url编码,编码结果是’百分号+16进制的形式’,一般GET方式中会出现这个问题

from urllib.parse import quote
quote("张三") #quote函数对张三进行了url编码

实现一个基本的爬虫

第一版代码

按照需求规格说明书的流程写程序,直观的实现,不考虑结构

"""
1.抓取百度贴吧(lol吧)前10页内容(https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0)
2.存入文件
"""

import requests

'''
#第一版代码
for i in range(10):
    download_url = "https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn={}".format(i * 50)
    response = requests.get(download_url)
    print(response.text)
    file_name = "{}-第{}页.html".format("lol",i+1)
    with open(file_name,"wb") as f:
        f.write(response.content)
'''

第二版代码

考虑更灵活的参数配置,可以指定贴吧名称及下载页数,按照面向过程的思想实现函数

def download_tieba(tieba_name,page_nums):
    """
    下载指定贴吧的前page_nums页内容
    :param tieba_name: 贴吧名称
    :param page_nums: 要下载多少页
    :return: 无
    """
    for i in range(page_nums):
        download_url = "https://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}".format(tieba_name,i * 50)
        response = requests.get(download_url)
        print(response.text)
        file_name = "{}-第{}页.html".format(tieba_name, i + 1)
        with open(file_name, "wb") as f:
            f.write(response.content)


download_tieba("python",9)

第三版代码(面向对象的爬虫)

#import requests

class TiebaSpider(object):
    """
    实现下载某个贴吧指定页码前的内容,存储下载内容
    """
    def __init__(self,name,pages):
        """
        初始化方法
        """
        self.tieba_name = name
        self.pages_download = pages
        self.base_url = "https://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}"
        self.header = {"User-Agent": "Python"}

    def make_url_list(self):
        """
        获取待下载的url列表
        :return:返回生成的url列表
        """
        url_lists = []
        for i in range(self.pages_download):
            download_url = self.base_url.format(self.tieba_name, i * 50)
            url_lists.append(download_url)
        return url_lists

    #注意maybe static 警告,怎么消除警告?
    def save_url(self,content,file_name):
        """
        将指定内容进行存储
        :param content:要存储的内容,这里传入的参数要求是二进制
        :param file_name:文件名
        :return:无
        """
        with open(file_name,'wb') as f:
            f.write(content)

    def download_url(self,url_str):
        """
        下载指定url处的内容
        :param url_str: 要下载的地址
        :return: 返回下载的结果
        """
        response = requests.get(url_str,headers=self.header)
        return response.content #content是二进制数据

    def run(self):
        """
        主业务逻辑,使用run后期可以改造成多线程爬虫
        :return:
        """
        url_lists = self.make_url_list()
        for url_str in url_lists:
            result_content = self.download_url(url_str)
            file_name = "{}-第{}页.html".format(self.tieba_name,url_lists.index(url_str)+1)
            self.save_url(result_content,file_name)


tieba_spider = TiebaSpider('Python',9)
tieba_spider.run()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值