爬虫时保持cookies一直有效的方法

# -*- coding: utf-8 -*-

"""
加载cookies文件,使用requests库爬取数据并动态更新cookies,可以使cookies不失效
"""

import pickle
import time
import requests
import random

class Spider:
    def __init__(self,domain='51job.com'):
        self.headers_51job={
            'Host': 'ehire.51job.com',
            'Origin':'http://ehire.51job.com',
            'User-Agent':"""Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36""",
            'Accept': """text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8""",
            'Accept-Language': """zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3""",
            'Referer': """http://ehire.51job.com/Jobs/JobSearchPost.aspx?IsHis=N""",
            'Upgrade-Insecure-Requests':'1',
            'Connection': 'keep-alive'
        }
        self.s=requests.Session()
        self.s.headers=self.headers_51job
        self.__domain = domain
        self.timeOut=30
        self.cookies={}


    def SetLoginDomain(self,domain='51job.com'):
        """设置登录域名"""
        self.__domain=domain
        return self.__domain

    def SetTimeOut(self,timeOut=30):
        self.__timeOut=timeOut
        return self.__timeOut

    def set_cookies(self):
        """读取cookie文件 该文件由另外一个登录程序获取"""
        with open('./cookies.txt') as f:
            cookies = pickle.loads(f.read())
        for cookie in cookies:
            self.cookies[cookie['name']]=cookie['value']
        self.s.cookies.update(self.cookies)

    def open_url(self, url,data=None):
        """页面请求方法"""
        # 请求页面方法
        MaxTryTimes = 20
        waite_time = random.uniform(0, 1)  # 初始化等待时间
        for i in range(MaxTryTimes):
            time.sleep(waite_time)
            try:
                req = self.s.post(url,data=data,headers=self.headers_51job,timeout=self.timeOut)
                content=req.text
                if req.cookies.get_dict():
                    self.s.cookies.update(req.cookies)
                break
            except Exception,e:
                print e
                content = ''
        return content

if __name__ == '__main__':
    spider=Spider()
    spider.set_cookies()
    content=spider.open_url(url='http://ehire.51job.com/Jobs/JobSearchPost.aspx?IsHis=N')
    print content
在C#中编写网络爬虫保持cookies长久有效,通常涉及使用HttpClient或者WebRequest/WebResponse等类,以及设置CookieContainer来保存和管理cookies。以下是基本步骤: 1. **创建CookieContainer**:首先,你需要创建一个`CookieContainer`实例,这是用于存储cookie的地方。 ```csharp using System.Net; CookieContainer container = new CookieContainer(); ``` 2. **发送请求并获取cookies**:每次向服务器发起HTTP请求,记得添加这个容器到HttpClient或WebRequest的Cookies属性中。 ```csharp HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Accept.Clear(); // 如果有需要,清空默认头信息 client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // 设置接受类型 // 使用CookieContainer发送GET请求 HttpResponseMessage response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead); if (response.IsSuccessStatusCode) { using (HttpContent content = response.Content) { var cookies = response.Cookies; // 获取响应中的cookies foreach (Cookie cookie in cookies) { container.Add(cookie); // 将cookies添加到container } } } ``` 3. **使用container发送带cookie的请求**:当你需要再次发送请求,设置HttpClient的CookieContainer属性,它会在请求头自动带上这些cookies。 ```csharp HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "your_token"); // 可能需要的授权信息 client.DefaultRequestHeaders.Cookie = container.GetCookies(request.RequestUri).Cast<Cookie>().Select(c => c.ToString()).ToList(); HttpResponseMessage response = await client.SendAsync(request); ``` 4. **持久化cookies**:如果你希望cookies在程序退出后也能保持,可以考虑将CookieContainer序列化到文件或者数据库中,下次启动再读取恢复。 5. **注意cookies有效期**:有些cookies可能是临的,如果它们有固定的过期间,你需要在处理cookies考虑这一点,避免过期。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值