1. 程式人生 > >php使用pthreads v3多執行緒的抓取新浪新聞資訊

php使用pthreads v3多執行緒的抓取新浪新聞資訊

<?php

class DB extends Worker
{
    private static $db;
    private $dsn;
    private $root;
    private $pwd;

    public function __construct($dsn, $root, $pwd)
    {
        $this->dsn = $dsn;
        $this->root = $root;
        $this->pwd = $pwd;
    }

    public function run()
    {
        //建立連線物件
        self::$db = new PDO($this->dsn, $this->root, $this->pwd);

        //把require放到worker執行緒中,不要放到主執行緒中,不然會報錯找不到類
        require './vendor/autoload.php';
    }

    //返回一個連線資源
    public function getConn()
    {
        return self::$db;
    }
}

class Sina extends Thread
{
    private $name;
    private $url;

    public function __construct($name, $url)
    {
        $this->name = $name;
        $this->url = $url;
    }

    public function run()
    {
        $db = $this->worker->getConn();

        if (empty($db) || empty($this->url)) {
            return false;
        }

        $content = file_get_contents($this->url);
        if (!empty($content)) {
            //獲取標題,地址,時間
            $data = QL\QueryList::Query($content, [
                'tit' => ['.c_tit > a', 'text'],
                'url' => ['.c_tit > a', 'href'],
                'time' => ['.c_time', 'text'],
            ], '', 'UTF-8', 'GB2312')->getData();

            //把獲取的資料插入資料庫
            if (!empty($data)) {
                $sql = 'INSERT INTO tb_sina(`url`, `title`, `time`) VALUES';
                foreach ($data as $row) {
                    //修改下時間,新浪的時間格式是這樣的04-23 15:30
                    $time = date('Y') . '-' . $row['time'] . ':00';
                    $sql .= "('{$row['url']}', '{$row['tit']}', '{$time}'),";
                }
                $sql = rtrim($sql, ',');
                $ret = $db->exec($sql);

                if ($ret !== false) {
                    echo "執行緒{$this->name}成功插入{$ret}條資料\n";
                } else {
                    var_dump($db->errorInfo());
                }
            }
        }
    }
}

//抓取頁面地址
$url = 'http://roll.news.sina.com.cn/s/channel.php?ch=01#col=89&spec=&type=&ch=01&k=&offset_page=0&offset_num=0&num=60&asc=&page=';
//建立pool池
$pool = new Pool(5, 'DB', ['mysql:dbname=test;host=192.168.33.226', 'root', '']);

//獲取100個分頁資料
for ($ix = 1; $ix <= 100; $ix++) {
    $pool->submit(new Sina($ix, $url . $ix));
}

//迴圈收集垃圾,阻塞主執行緒,等待子執行緒結束
while ($pool->collect()) ;
$pool->shutdown();

相關推薦

python:執行西刺和快站 高匿代理IP

  一開始是打算去抓取一些資料,但是總是訪問次數多了之後被封IP,所以做了一個專門做了個工具用來抓取在西刺和快站的高匿IP。   執行環境的話是在python3.5下執行的,需要requests庫   在製作的過程中也參考的以下網上其他人的做法,但是發現很大一部分都不是多執行緒去抓取有點浪費時間了,又或者

用JAVA實現簡單爬蟲執行

在迴圈爬取得基礎上進行多執行緒爬蟲,本程式中使用的三個執行緒,執行緒為實現runnable介面,並使用物件鎖防止併發共同去訪問同一個物件。讓三個執行緒同時爬去同一個url並且得到的新的url不重複。 import java.io.*; import j

python執行網頁內容並寫入MYSQL

自己的第一個多執行緒練習,中間踩了不少坑,程式寫的很渣,但是勉強能實現功能需求了 ,實際上抓取網頁是多執行緒在MYSQL寫入的時候是加了執行緒鎖的 ,實際上感覺就不是在多執行緒寫入了,不過作為第一個練習程式就這樣吧 ,後續部落格還會繼續更新優化版本。## htm

Python requests 執行 出現HTTPConnectionPool Max retires exceeded異常

場景: 在做爬蟲專案或者是在傳送網路請求的時候,一般都會用到request模組,但是經常會遇到: HTTPConnectionPool Max retires exceeded read t

資料探勘_執行

在這一篇文章中,我們主要來介紹多執行緒抓取資料。 多執行緒是以併發的方式執行的,在這裡要注意,Python的多執行緒程式只能執行在一個單核上以併發的方式執行,即便是多核的機器,所以說,使用多執行緒抓取可以極大地提高抓取效率下面我們以requests為例介紹多執行緒抓取,然後在

簡單的python3 urllib3 執行 圖片

#!/usr/bin/env python3 # -*- coding: utf-8 -*- # @author: liukelin  [email protected] # 多執行緒 抓取 圖片 #  import urllib3 import string i

goLang 執行網頁資料

突然有個想法想用goLang快速的抓取網頁資料,於是想到了 多執行緒進行頁面抓取 package main import ( "fmt" "log" "net/http" "os" "st

php使用pthreads v3執行新聞資訊

<?php class DB extends Worker { private static $db; private $dsn; private $root; private $pwd; public function __constr

spider----利用執行51job案例

程式碼如下 import json from threading import Thread from threading import Lock from queue import Queue import requests from bs4 import BeautifulSoup i

Jsoup簡單例子2.0——執行網頁內的郵箱

上一篇文章講了利用Jsoup爬取貼吧帖子裡的郵箱,雖然爬取成功了,但我對效率有所追求。10頁的帖子爬取了兩百多個郵箱,最快用時8秒,一般需要9秒。在思考了一下怎麼提升效率後,決定採用多執行緒的方式爬取網頁內的郵箱。廢話不多說,直接上程式碼。 引入Jsoup的jar包此處省略,沒有的可以檢視上篇文

【Python3爬蟲-爬圖片】執行中國國家地理全站美圖,圖可以提高你的審美哦

宣告:爬蟲為學習使用,請各位同學務必不要對當放網站或i伺服器造成傷害。務必不要寫死迴圈。 - 思路:古鎮——古鎮列表(迴圈獲取古鎮詳情href)——xx古鎮詳情(獲取所有img的src) - 1.  單分類爬: from bs4 import BeautifulSo

使用python的requests、xpath和執行糗事百科的段子

 程式碼主要使用的python中的requests模組、xpath功能和threading多執行緒爬取了糗事百科中段子的內容、圖片和閱讀數、段子作者的性別,年齡和頭像。 # author: aspiring import requests from lxml import

使用threading,queue,fake_useragent,requests ,lxml,執行嗅事百科13頁文字資料,爬蟲案例

#author:huangtao # coding=utf-8 #多執行緒庫 from threading import Thread #佇列庫 from queue import Queue #請求庫 from fake_useragent import UserAgent

Python爬蟲入門教程 10-100 圖蟲網執行

寫在前面 經歷了一頓噼裡啪啦的操作之後,終於我把部落格寫到了第10篇,後面,慢慢的會涉及到更多的爬蟲模組,有人問scrapy 啥時候開始用,這個我預計要在30篇以後了吧,後面的套路依舊慢節奏的,所以莫著急了,100篇呢,預計4~5個月寫完,常見的反反爬後面也會寫的,還有fuck login類的內容。

java redis執行國美商品資訊

前面那篇爬蟲文章用的是單執行緒沒有用到其它一些比較提高效率的工具比較遺憾,所以今天做了一個比較全面的爬蟲。首先謝謝 @[天不生我萬古長](https://www.jianshu.com/u/e34019621ee9)這位小夥伴的留言,不然還真有點懶了。因為上班所以也只能利用

Python爬蟲教程:圖蟲網執行

我們這次也玩點以前沒寫過的,使用python中的queue,也就是佇列 下面是我從別人那順來的一些解釋,基本爬蟲初期也就用到這麼多 Python學習資料或者需要程式碼、視訊加Python學習群:960410445 1. 初始化: classQueue.Queue(maxsize)FIFO

python執行網頁

#-*- encoding:utf8 -*- ''' Created on 2018年12月25日 @author: Administrator ''' from multiprocessing.dummy import Pool as pl import csv import requests fr

Python爬蟲入門教程 13-100 鬥圖啦表情包執行

寫在前面 今天在CSDN部落格,發現好多人寫爬蟲都在爬取一個叫做鬥圖啦的網站,裡面很多表情包,然後瞅了瞅,各種實現方式都有,今天我給你實現一個多執行緒版本的。關鍵技術點 aiohttp ,你可以看一下我前面的文章,然後在學習一下。 網站就不分析了,無非就是找到規律,拼接URL,匹配關鍵點,然後爬取。 擼

Python爬蟲入門教程 14-100 All IT eBooks執行

寫在前面 對一個爬蟲愛好者來說,或多或少都有這麼一點點的收集癖 ~ 發現好的圖片,發現好的書籍,發現各種能存放在電腦上的東西,都喜歡把它批量的爬取下來。 然後放著,是的,就這麼放著.......然後慢慢的遺忘掉..... 爬蟲分析 開啟網址 http://www.allitebooks.c

Python爬蟲教程:執行電子書

程式碼非常簡單,有咱們前面的教程做鋪墊,很少的程式碼就可以實現完整的功能了,最後把採集到的內容寫到  csv 檔案裡面,(  csv  是啥,你百度一下就知道了) 這段程式碼是  IO密集操作  我們採用  aiohttp  模