PHP蜘蛛爬蟲開發文件

kakasaber發表於2021-01-12

PHP蜘蛛爬蟲開發文件

官方文件

  1. https://doc.phpspider.org/

githup地址

  1. https://github.com/owner888/phpspider

phpspider-master/core 檔案介紹

檔名 描述
init.php 公共入口檔案
constans.php 公共入口檔案
phpspider.php 核心類檔案
- -
configs詳解 -
requests.php 請求類檔案
selector.php 選擇器類檔案
db.php 資料庫類檔案
cache.php 快取類檔案
log.php 日誌類檔案
queue.php Redis操作類檔案
util.php 實用函式集合類檔案
worker.php 多程式操作類

載入核心檔案

  1. require './vendor/autoload.php';
  2. use phpspider\core\phpspider;

requests.php 請求類 詳解

成員 描述
input_encoding 輸入編碼明確指定輸入的頁面編碼格式(UTF-8,GB2312,…..),防止出現亂碼,如果設定null則自動識別
output_encoding 輸出編碼明確指定輸出的編碼格式(UTF-8,GB2312,…..),防止出現亂碼,如果設定null則為utf-8
encoding 獲取網頁編碼
content 獲取響應內容 - 轉碼前內容
text 獲取響應內容 - 轉碼後內容
status_code 網頁狀態碼
headers 獲取響應頭
request 獲取請求頭
  1. # 載入 核心檔案

  2. require './vendor/autoload.php';

  3. use phpspider\core\phpspider;

  4. # 載入 請求類檔案

  5. use phpspider\core\requests;

  6. # 設定 輸入編碼

  7. requests::$input_encoding = null; // null=自動識別

  8. # 設定 輸出編碼

  9. requests::$output_encoding = null; // null=utf-8

  10. # 獲取 網頁編碼

  11. request::$encoding;

  12. # 獲取 響應內容 - 轉碼前內容

  13. request::$content;

  14. # 獲取 響應內容 - 轉碼後內容

  15. request::$text;

  16. # 獲取 網頁狀態碼

  17. request::$status_code;

  18. # 獲取 獲取響應頭

  19. request::$headers;

  20. # 獲取 獲取請求頭

  21. request::$request;

方法 描述
set_timeout( $timeout ) 設定請求超時時間
set_proxy( $proxy ) 設定請求代理
set_useragent( $useragent ) 瀏覽器useragent(UA)
set_referer( $referer ) 瀏覽器請求來路URL
set_header( $key, $value ) 新增請求的Header
set_cookie( $key, $value, $domain = ‘’ ) 新增請求的Cookie
get_cookie( $name, $domain = ‘’ ) 獲取請求的Cookie
set_cookies( $cookies, $domain = ‘’ ) 設定請求Cookie
get_cookie( $domain = ‘’ ) 獲取請求的Cookie
set_client_ip( $ip ) 設定請求偽IP
set_hosts( $host, $ips ) 設定請求的第三方主機和IP
get( $url, $params, $allow_redirects, $cert ) 用來獲取某個網頁
post( $url, $params, $files, $allow_redirects, $cert ) 用來獲取某個網頁
put( $url, $params, $allow_redirects, $cert ) 用來獲取某個網頁
delete( $url, $params, $allow_redirects, $cert ) 用來獲取某個網頁
  1. # 設定 請求超時時間

  2. # 1. 單一值 (同時設定connect和read)

  3. requests::set_timeout(10);

  4. # 2. 陣列值 (設定connect和read二者的timeout)

  5. requests::set_timeout( array(3, 27) );

  6. # 設定 請求代理

  7. 1. 字串

  8. requests::set_proxy('http://user:pass@host:port');

  9. 2. 陣列

  10. requests::set_proxy(

  11. array(

  12. 'http://user:pass@host:port',

  13. 'http://user:pass@host:port'

  14. )

  15. );

  16. # 設定 UA頭

  17. // 1. 字串

  18. requests::set_useragent("Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/");

  19. // 2. 陣列

  20. requests::set_proxy(

  21. array(

  22. "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/",

  23. "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/"

  24. )

  25. );

  26. # 設定 請求來路URL

  27. requests::set_referer('https://www.baidu.com');

  28. # 設定 請求的Header

  29. requests::set_header("Referer", "http://www.baidu.com");

  30. # 新增 請求的Cookie

  31. requests::set_cookie("BAIDUID", "FEE96299191CB0F11954F3A0060FB470:FG=1", "http://www.baidu.com");

  32. requests::set_cookie("BAIDUID=FEE96299191CB0F11954F3A0060FB470:FG=1", "http://www.baidu.com");

  33. # 獲取 請求的Cookie

  34. requests::get_cookie("BAIDUID", "http://www.baidu.com");

  35. requests::get_cookie("http://www.baidu.com");

  36. # 設定 設定請求偽IP

  37. // 1. 單一值

  38. requests::set_client_ip("192.168.0.2");

  39. // 2. 陣列

  40. requests::set_client_ip(

  41. array(

  42. "192.168.0.1",

  43. "192.168.0.2"

  44. )

  45. );

  46. # 設定 請求的第三方主機和IP

  47. requests::set_hosts(

  48. "http://www.baidu.com",

  49. array(

  50. "203.195.143.21",

  51. "203.195.143.22"

  52. )

  53. );

  54. # 發起 get 請求

  55. requests::get("https://github.com/timeline.json");

  56. # 發起 post 請求

  57. // 1. 登入

  58. requests::post(

  59. "http://www.domain.com",

  60. array(

  61. "username" => "test", "password" => "test"

  62. )

  63. );

  64. // 2. 檔案上傳

  65. request::post(

  66. "http://www.domain.com",

  67. null,

  68. array(

  69. "file1" => "test1.jpg",

  70. "file2" => "test2.jpg"

  71. )

  72. );

  73. # 發起 put 請求

  74. requests::put(

  75. "http://www.domain.com",

  76. "{username:\"test888\",username:\"123456\"}"

  77. );

  78. # 發起 delete 請求

  79. requests::delete(

  80. "http://www.domain.com",

  81. "{username:\"test888\"}"

  82. );


selector.php 選擇器類 詳解

方法 描述
select( $html, $selector, $selector_type = ‘xpath’ ) 選擇匹配的內容
remove( $html, $selector, $selector_type = ‘xpath’ ) 刪除匹配的內容
  1. /**

  2. * select( $html, $selector, $selector_type = 'xpath' )

  3. * @param $html 需要篩選的網頁內容

  4. * @param $selector 選擇器規則

  5. * @param $selector_type 選擇器型別: xpath (預設) / regex / css

  6. */

  7. # 1. xpath

  8. $html = requests::get("https://news.163.com/20/0831/15/FLCBLJOT000189FH.html");

  9. $data = selector::select($html, '//*[@id="endText"]'); // 讀取 網易新聞 新聞內容

  10. var_dump($data);

  11. # 2. css

  12. $html = requests::get("https://news.163.com/20/0831/15/FLCBLJOT000189FH.html");

  13. $data = selector::select($html, ".post_content_main > h1", "css"); // 讀取 網易新聞 詳情頁標題

  14. var_dump($data);

  15. # 3. regex

  16. $html = requests::get("https://news.163.com/20/0831/15/FLCBLJOT000189FH.html");

  17. $data = selector::select($html, "@<title>(.*?)</title>@", "regex"); // 讀取 網易新聞 title標題內容

  18. var_dump($data);

  19. /**

  20. * remove( $html, $selector, $selector_type = 'xpath' )

  21. * @param $html 需要篩選的網頁內容

  22. * @param $selector 選擇器規則

  23. * @param $selector_type 選擇器型別: xpath (預設) / regex / css

  24. */

  25. $html = requests::get("https://news.163.com/20/0831/15/FLCBLJOT000189FH.html");

  26. $html = selector::select($html, '//*[@id="endText"]'); // 讀取 網易新聞 新聞內容

  27. // 在上面獲取的內容基礎上,刪除第一個<p>標籤(原標題)

  28. $data = selector::select($html, '//*[@id="endText"]/p[1]');

  29. var_dump($data);


db.php 資料庫類 詳解

  1. # 資料配置連結
  2. $db_config = array(
  3. 'host' => '127.0.0.1',
  4. 'port' => 3306,
  5. 'user' => 'root',
  6. 'pass' => '123456',
  7. 'name' => 'demo_db'
  8. );
  9. // 資料庫配置
  10. db::set_connect('default', $db_config);
  11. // 資料庫連線
  12. db::init_mysql();
方法 描述
query($sql) 原生SQL操作
get_one($sql) 原生SQL操作
get_all($sql) 單條查詢
insert($table, $data) 單條插入
insert_batch($table, $data) 單條修改
update_batch($table, $data, $index) 批量修改
delete($table, $where) 單條刪除
  1. # query 原生操作

  2. // 1. 查詢

  3. $query = db::query("select * fromcontent");

  4. while($row = db::fetch($query)) {

  5. echo "id = {$row['id']}; name = {$row['name']}; \n";

  6. }

  7. // 2. 新增

  8. db::query("insert intocontent(name) values (test);");

  9. // 3. 更新

  10. db::query("updatecontentsetname='test' whereid=1;");

  11. // 4. 刪除

  12. db::query("delete fromcontentwhereid=1;");

  13. # get_one

  14. $row = db::get_one("select * fromcontentwhereid=1;");

  15. # get_all

  16. $rows = db::get_all("select * fromcontentlimit 5;");

  17. # insert

  18. $rows = db::insert('content', array('name' => 'test'));

  19. # insert_batch

  20. $rows = db::insert_batch(

  21. 'content',

  22. array(

  23. array(

  24. 'name' => 'test1'

  25. ),

  26. array(

  27. 'name' => 'test2'

  28. )

  29. )

  30. );

  31. # update_batch

  32. db::update_batch(

  33. 'content',

  34. array(

  35. array(

  36. 'id' => 1,

  37. 'name' => 'test1'

  38. ),

  39. array(

  40. 'id' => 2,

  41. 'name' => 'test2'

  42. )

  43. ),

  44. 'id' // 以 id 為條件進行修改

  45. );

  46. # delete

  47. $rows = db::delete('content', "id=1");


使用 configs 來編寫爬蟲

  1. # 載入 核心檔案

  2. require './vendor/autoload.php';

  3. use phpspider\core\phpspider;

  4. # 官方文件說不要刪除這段註釋,我並不知道有什麼用,文件說加就加

  5. /* Do NOT delete this comment */

  6. /* 不要刪除這段註釋 */

  7. # $configs = array(

  8. 'name' => '163新聞', // 當前爬蟲名稱

  9. 'log_show' => false, // 是否顯示日誌, 預設false, 可選 true (顯示除錯資訊) | false (顯示爬取皮膚, tail -f data/phpspider.log 檢視日誌)

  10. 'log_file' => 'data/phpspider.log', // 日誌檔案路徑, 預設 data/phpspider.log

  11. 'log_type' => '', // 顯示和記錄的日誌型別, 預設空, 可選 info(普通) | warn(警告) | debug(除錯) | error(錯誤 )

  12. 'input_encoding' => null, // 輸入編碼, 預設null(自動識別)

  13. 'output_encoding' => null, // 輸出編碼, 預設null(null=utf-8)

  14. 'tasknum' => 1, // 同時工作的爬蟲任務數, 預設1(單程式任務爬取)

  15. 'multiserver' => false, // 多伺服器處理, 預設false, 可選 true | false

  16. 'serverid' => 1, // 伺服器ID, 預設1, 啟用第二天伺服器可設定為2

  17. 'save_running_state' => false, // 儲存爬蟲執行狀態, 預設false(不儲存), 可選 true | false

  18. 'queue_config' => array( // redis 配置, 儲存爬蟲執行狀態、多工處理 和 多伺服器處理 都需要 redis 來儲存採集任務資料

  19. 'host' => '127.0.0.1',

  20. 'port' => 6379,

  21. 'pass' => '',

  22. 'db' => 5,

  23. 'prefix' => 'phpspider',

  24. 'timeout' => 30

  25. ),

  26. 'proxy' => array( // 代理伺服器,如果爬取的網站根據ip做了反爬蟲,可以設定此項

  27. 'http://host:port',

  28. 'http://user:pass@host:port',

  29. ),

  30. 'interval' => 1000, // 爬取單個網頁的時間間隔, 單位毫秒

  31. 'timeout' => 5, // 爬取每個網頁的超時時間, 單位秒

  32. 'max_try' => 0, // 爬取每個網頁失敗後嘗試次數, 預設0(不重複爬取)

  33. 'max_depth' => 0, // 爬取網頁深度, 超過深度的頁面不再採集, 預設0(不限制)

  34. 'max_fields' => 0, // 爬取內容網頁最大條數, 預設0(不限制)

  35. 'user_agent' => "", // 爬取網頁所使用的瀏覽器型別

  36. // 1. 列舉型別

  37. // phpspider::AGENT_ANDROID, 表示爬蟲爬取網頁時, 使用安卓手機瀏覽器

  38. // phpspider::AGENT_IOS, 表示爬蟲爬取網頁時, 使用蘋果手機瀏覽器

  39. // phpspider::AGENT_PC, 表示爬蟲爬取網頁時, 使用PC瀏覽器

  40. // phpspider::AGENT_MOBILE, 表示爬蟲爬取網頁時, 使用移動裝置瀏覽器

  41. // 2. 自定義型別

  42. // 'user_agent' => "Mozilla/5.0"

  43. // 3. 隨機瀏覽器型別

  44. // 'user_agent' => array(

  45. // "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",

  46. // "Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_3 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G34 Safari/601.1",

  47. // "Mozilla/5.0 (Linux; U; Android 6.0.1;zh_cn; Le X820 Build/FEXCNFN5801507014S) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/49.0.0.0 Mobile Safari/537.36 EUI Browser/5.8.015S",

  48. // );

  49. 'client_ip' => "", // 爬取網頁所使用的偽IP,用於破解防採集

  50. // 1. 字串型別

  51. // 'client_ip' => '192.168.0.2'

  52. // 2. 陣列型別

  53. // 'client_ip' => array(

  54. // '192.160.0.1',

  55. // '192.160.0.2',

  56. // );

  57. 'export' => array( // 爬取資料資料匯出

  58. 'type' => 'csv', // 匯出型別 csv | sql | db

  59. 'file' => './data/163_news.csv', // 匯出檔案路徑

  60. // 'type' => 'sql'

  61. // 'file' => './data/163_news.sql',

  62. // 'table' => 'news_table', // 匯出db、sql資料庫表名

  63. // 'type' => 'db'

  64. // 'table' => 'news_table', // 匯出db、sql資料庫表名

  65. ),

  66. 'db_config' => array( // 資料庫配置

  67. 'host' => '127.0.0.1',

  68. 'port' => 3306,

  69. 'user' => 'root',

  70. 'pass' => 'root',

  71. 'name' => 'demo',

  72. ),

  73. 'domains' => array( // 定義爬蟲爬取哪些域名下的網頁, 非域名下的url會被忽略以提高爬取速度

  74. '163.com',

  75. 'new.163.com'

  76. ),

  77. 'scan_urls' => array( // 定義爬蟲的入口連結, 爬蟲從這些連結開始爬取,同時這些連結也是監控爬蟲所要監控的連結

  78. 'https://news.163.com'

  79. ),

  80. 'content_url_regexes' => array( // 定義內容頁url的規則, 正規表示式 最好填寫以提高爬取效率

  81. 'https://news.163.com/\d+/\d+/\d+/\w+.html'

  82. ),

  83. 'list_url_regexes' => array( // 定義列表頁url的規則, 對於有列表頁的網站, 使用此配置可以大幅提高爬蟲的爬取速率

  84. 'https://news.163.com/gz/page/\d+.html'

  85. ),

  86. 'fields' => array( // 定義內容頁的抽取規則, 規則由一個個field組成, 一個field代表一個資料抽取項

  87. array(

  88. 'name' => "content", // 名稱, 不能為空

  89. 'selector' => '//*[@id="endText"]', // 定義抽取規則, 不能為空, 預設使用xpath

  90. 'selector_type' => 'xpath', // 抽取規則型別, 預設xpath, 可選 xpaht | jsonpath | regex

  91. 'required' => true, // 是否必須的, 預設false, 可選 true | false

  92. 'repeated' => false, // 抽取到的內容是否多項, 預設false, 可選 false | true(結果都是陣列型別)

  93. 'children' => array( // 為此field定義子項, 子項的定義仍然是一個fields陣列

  94. array(

  95. 'name' => 'replay', // # 例如抽取新聞下面的評論

  96. 'selector' => "//div[contains(@class,'replay')]"

  97. )

  98. ),

  99. 'source_type' => 'url_content', // 該field的資料來源, 預設從當前的網頁 (url_context) 中抽取資料, 可選 url_context | attached_url

  100. // 'source_type' => 'attached_url',

  101. // 'attached_url' => 'https://news.163.com/{comment_id}/comments', // 當source_type設定為attached_url時, 定義新請求的url

  102. ),

  103. array(

  104. 'name' => "title",

  105. 'selector' => '//*[@id="epContentLeft"]/h1',

  106. )

  107. )

  108. );

  109. // 載入配置

  110. $spider = new phpspider($configs);

  111. // 啟動爬蟲

  112. $spider->start();

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章