php与python实现的线程池多线程爬虫功能示例


Posted in PHP onOctober 12, 2016

本文实例讲述了php与python实现的线程池多线程爬虫功能。分享给大家供大家参考,具体如下:

多线程爬虫可以用于抓取内容了这个可以提升性能了,这里我们来看php与python 线程池多线程爬虫的例子,代码如下:

php例子

<?php
class Connect extends Worker //worker模式
{
public function __construct()
{
}
public function getConnection()
{
if (!self::$ch)
{
self::$ch = curl_init();
curl_setopt(self::$ch, CURLOPT_TIMEOUT, 2);
curl_setopt(self::$ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt(self::$ch, CURLOPT_HEADER, 0);
curl_setopt(self::$ch, CURLOPT_NOSIGNAL, true);
curl_setopt(self::$ch, CURLOPT_USERAGENT, "Firefox");
curl_setopt(self::$ch, CURLOPT_FOLLOWLOCATION, 1);
}
/* do some exception/error stuff here maybe */
return self::$ch;
}
public function closeConnection()
{
curl_close(self::$ch);
}
/**
* Note that the link is stored statically, which for pthreads, means thread local
* */
protected static $ch;
}
class Query extends Threaded
{
public function __construct($url)
{
$this->url = $url;
}
public function run()
{
$ch = $this->worker->getConnection();
curl_setopt($ch, CURLOPT_URL, $this->url);
$page = curl_exec($ch);
$info = curl_getinfo($ch);
$error = curl_error($ch);
$this->deal_data($this->url, $page, $info, $error);
$this->result = $page;
}
function deal_data($url, $page, $info, $error)
{
$parts = explode(".", $url);
$id = $parts[1];
if ($info['http_code'] != 200)
{
$this->show_msg($id, $error);
} else
{
$this->show_msg($id, "OK");
}
}
function show_msg($id, $msg)
{
echo $id."\t$msg\n";
}
public function getResult()
{
return $this->result;
}
protected $url;
protected $result;
}
function check_urls_multi_pthreads()
{
global $check_urls; //定义抓取的连接
$check_urls = array( 'http://xxx.com' => "xx网",);
$pool = new Pool(10, "Connect", array()); //建立10个线程池
foreach ($check_urls as $url => $name)
{
$pool->submit(new Query($url));
}
$pool->shutdown();
}
check_urls_multi_pthreads();
python 多线程
def handle(sid)://这个方法内执行爬虫数据处理
pass
class MyThread(Thread):
"""docstring for ClassName"""
def __init__(self, sid):
Thread.__init__(self)
self.sid = sid
def run():
handle(self.sid)
threads = []
for i in xrange(1,11):
t = MyThread(i)
threads.append(t)
t.start()
for t in threads:
t.join()

python 线程池爬虫:

from queue import Queue
from threading import Thread, Lock
import urllib.parse
import socket
import re
import time
seen_urls = set(['/'])
lock = Lock()
class Fetcher(Thread):
  def __init__(self, tasks):
    Thread.__init__(self)
    self.tasks = tasks
    self.daemon = True
    self.start()
  def run(self):
    while True:
      url = self.tasks.get()
      print(url)
      sock = socket.socket()
      sock.connect(('localhost', 3000))
      get = 'GET {} HTTP/1.0\r\nHost: localhost\r\n\r\n'.format(url)
      sock.send(get.encode('ascii'))
      response = b''
      chunk = sock.recv(4096)
      while chunk:
        response += chunk
        chunk = sock.recv(4096)
      links = self.parse_links(url, response)
      lock.acquire()
      for link in links.difference(seen_urls):
        self.tasks.put(link)
      seen_urls.update(links)
      lock.release()
      self.tasks.task_done()
  def parse_links(self, fetched_url, response):
    if not response:
      print('error: {}'.format(fetched_url))
      return set()
    if not self._is_html(response):
      return set()
    urls = set(re.findall(r'''(?i)href=["']?([^\s"'<>]+)''',
               self.body(response)))
    links = set()
    for url in urls:
      normalized = urllib.parse.urljoin(fetched_url, url)
      parts = urllib.parse.urlparse(normalized)
      if parts.scheme not in ('', 'http', 'https'):
        continue
      host, port = urllib.parse.splitport(parts.netloc)
      if host and host.lower() not in ('localhost'):
        continue
      defragmented, frag = urllib.parse.urldefrag(parts.path)
      links.add(defragmented)
    return links
  def body(self, response):
    body = response.split(b'\r\n\r\n', 1)[1]
    return body.decode('utf-8')
  def _is_html(self, response):
    head, body = response.split(b'\r\n\r\n', 1)
    headers = dict(h.split(': ') for h in head.decode().split('\r\n')[1:])
    return headers.get('Content-Type', '').startswith('text/html')
class ThreadPool:
  def __init__(self, num_threads):
    self.tasks = Queue()
    for _ in range(num_threads):
      Fetcher(self.tasks)
  def add_task(self, url):
    self.tasks.put(url)
  def wait_completion(self):
    self.tasks.join()
if __name__ == '__main__':
  start = time.time()
  pool = ThreadPool(4)
  pool.add_task("/")
  pool.wait_completion()
  print('{} URLs fetched in {:.1f} seconds'.format(len(seen_urls),time.time() - start))

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
Session保存到数据库的php类分享
Oct 24 PHP
php修改NetBeans默认字体的大小
Jul 02 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
Jun 25 PHP
thinkphp连贯操作实例分析
Nov 22 PHP
PHP中数据类型转换的三种方式
Apr 02 PHP
php等比例缩放图片及剪切图片代码分享
Feb 13 PHP
linux下为php添加iconv模块的方法
Feb 28 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
Feb 04 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 #PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 #PHP
基于php实现的php代码加密解密类完整实例
Oct 12 #PHP
php fseek函数读取大文件两种方法
Oct 12 #PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 #PHP
php 无限分类 树形数据格式化代码
Oct 11 #PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 #PHP
You might like
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
PHP使用内置函数生成图片的方法详解
2016/05/09 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
JS画线(实例代码)
2013/11/20 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
JS应用正则表达式转换大小写示例
2014/09/18 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
Javascript点击按钮随机改变数字与其颜色
2016/09/01 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
2019/01/15 jQuery
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
Vue实现跑马灯效果
2020/05/25 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
用Python编写一个简单的FUSE文件系统的教程
2015/04/02 Python
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
python求质数列表的例子
2019/11/24 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
小学教师节活动方案
2014/01/31 职场文书
物资采购方案
2014/06/12 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
金融保险专业求职信
2014/09/03 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
六一亲子活动感想
2015/08/07 职场文书
新学期开学寄语2016
2015/12/04 职场文书
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server