多账号定向网站爬取关键技术
来源:互联网 发布:mac air 装单win详细 编辑:程序博客网 时间:2024/06/05 00:54
场景描述:
多个帐号模拟登录同一个网站,将不同帐号的cookie保存至本地,对于网站中的异步接口数据,各个帐号(通过携带cookie)都可同时并行请求。
问题描述:
假设有不同帐号,100个线程的爬取请求的cookie失效时,某个线程将会占有唯一浏览器,重新登录网站。其它线程如何处理?
1 爬取线程不应该直接刷新cookie,而是提交刷新cookie的需求
2 由cookie管理器控制哪个请求线程具体占有浏览器实现登录,获取cookie
cookie刷新观察者,监听cookie刷新的需求,并实际执行cookie刷新
public class CookiesAskWatcher implements Observer{
private CookiesFlushSemaphore cookiesFlushSemaphore;
CookiesAskWatcher(CookiesFlushSemaphore cookiesFlushSemaphore){
this.cookiesFlushSemaphore = cookiesFlushSemaphore;
}
@Override
public void update(Observable o, Object arg) {
CookiesStoreUtils.flush(帐号,密码);
cookiesFlushSemaphore.confirmFlush();
}
}
cookie刷新的请求的被观察者,根据情况提交刷行请求,或者阻塞,唤醒后直接使用可用的cookie
public class CookiesAskWatched extends Observable{
private boolean volatile isFlushing = false;
private CookiesFlushSemaphore cookiesFlushSemaphore;
public CookiesAskWatched(CookiesFlushSemaphore cookiesFlushSemaphore){
this.cookiesFlushSemaphore = cookiesFlushSemaphore;
}
public void askFlush(Param param) throws Exception{
if(isFlushing == false){
synchronized (this) {
if (isFlushing == false) {
isFlushing = true;
setChanged();
notifyObservers(param);
isFlushing = false;
return;
}
}
}
cookiesFlushSemaphore.waitFlush();
}
}
cookie管理者,初始化需要定义cookie观察者和主题
public class CookiesManager {
private static Map<Integer, CookiesAskWatched> watcheds = new HashMap<>();
public CookiesManager(){
int i = 1;
while (i <= 4){
CookiesFlushSemaphore cookiesFlushSemaphore = new CookiesFlushSemaphore();
CookiesAskWatched cookiesAskWatched = new CookiesAskWatched(cookiesFlushSemaphore);
cookiesAskWatched.addObserver(new CookiesAskWatcher(cookiesFlushSemaphore));
watcheds.put(i, cookiesAskWatched);
i++;
}
}
public void submitFlush(Param param) throws Exception{
Integer masterCard = param.getMasterCard();
watcheds.get(masterCard).askFlush(param);
}
}
信号量,换起阻塞的线程
public class CookiesFlushSemaphore {
private boolean signal = false;
public synchronized void waitFlush() throws InterruptedException{
this.signal = false;
while (!this.signal)wait();
}
public synchronized void confirmFlush(){
this.signal = true;
this.notifyAll();
}
}
- 多账号定向网站爬取关键技术
- 定向网页爬取
- Python利用BeautifulSoup4爬取账号共享网站的vip账户
- 爬取校园网1000多条账号密码
- 淘宝搜索定向爬取
- 爬虫的定向爬取
- python爬虫定向爬取中国大学排名
- 中国大学排名定向爬取实例
- Python的定向爬取实例
- 爬取网站图片
- 爬取网站段子
- 网站爬取
- 大型网站提速关键技术
- 大型网站架构提速关键技术
- 爬虫的关键技术(以电影数据的爬取为例)
- 简单的爬取网站
- python爬取网站图片
- Python爬取网站图片
- PHP 操作 redis 手册
- hive文件存储格式
- python urllib2用url爬前程无忧职位信息
- Android edittext输入的身份证号 邮箱 中文格式是否正确
- GMRP
- 多账号定向网站爬取关键技术
- mybatis级联查询传参(map保存多参数传参)
- 【精选干货】阿里巴巴Java面试题锦集
- 扫雷
- SDL详情介绍
- python与pip安装及配置环境
- [Leetcode] 377. Combination Sum IV 解题报告
- sgu224Little Queens 225. Little Knights
- SpringBoot搭建,10分钟教你完成框架SpringBoot+hibernate+jpa