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 相关文章推荐
非常好的php目录导航文件代码
Oct 09 PHP
php注销代码(session注销)
May 31 PHP
php 判断字符串中是否包含html标签
Feb 17 PHP
php导出CSV抽象类实例
Sep 24 PHP
php递归遍历删除文件的方法
Apr 17 PHP
如何使用php实现评委评分器
Jul 31 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
Nov 05 PHP
简述php环境搭建与配置
Dec 05 PHP
Laravel5框架添加自定义辅助函数的方法
Aug 01 PHP
PHP 二维array转换json的实例讲解
Aug 21 PHP
Laravel多域名下字段验证的方法
Apr 04 PHP
PHP实现百度人脸识别
May 06 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
php中smarty变量修饰用法实例分析
2015/06/11 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
执行iframe中的javascript方法
2008/10/07 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
jQuery属性选择器用法示例
2016/09/09 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
python比较两个列表大小的方法
2015/07/11 Python
改进Django中的表单的简单方法
2015/07/17 Python
python交互式图形编程实例(二)
2017/11/17 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
Windows下安装Scrapy
2018/10/17 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
Django中自定义admin Xadmin的实现代码
2019/08/09 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
keras中的backend.clip用法
2020/05/22 Python
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
建筑专业自我鉴定
2013/10/22 职场文书
银行职员思想汇报
2013/12/31 职场文书
连锁酒店店长职责范本
2014/02/13 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
交通安全横幅标语
2014/10/07 职场文书
2014年医院党建工作总结
2014/12/20 职场文书
简历自我评价优缺点
2015/03/11 职场文书
教师求职信怎么写
2015/03/20 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android
AJAX实现省市县三级联动效果
2021/10/16 Javascript