前言
爬蟲還有一個很好玩的地方就是可以刷訪問量/瀏覽量。對于不同的網(wǎng)站有不同的統(tǒng)計(jì)訪問量的方法脆淹。有的會限制同一個IP的統(tǒng)計(jì)栖疑,有的是條件觸發(fā)的統(tǒng)計(jì)(如視頻播放網(wǎng)站惭笑,點(diǎn)擊播放算一次)预麸。這個系列教程會結(jié)合web技術(shù)嘗試解決這些問題瞪浸,實(shí)現(xiàn)穩(wěn)定刷訪問量。
分析原理
一些小型網(wǎng)站會把統(tǒng)計(jì)代碼寫進(jìn)php里面吏祸,每次訪問都會執(zhí)行一遍增加訪問量对蒲。那就可以直接用爬蟲抓取相關(guān)的頁面,讓它執(zhí)行一遍統(tǒng)計(jì)代碼贡翘。
測試環(huán)境
爬蟲環(huán)境
Windows 10
python 3.6.2
服務(wù)器測試環(huán)境
自己動手寫了個模擬的網(wǎng)站環(huán)境蹈矮,每次訪問該頁面,瀏覽次數(shù)就會+1 .
<?php
/**
* Created by PhpStorm.
* User: http://pingxonline.com
* Date: 2018/2/19 0019
* Time: 18:44
*/
include_once 'connect.php';
$db = new connectDataBase();
// 初始化
$visit = 0;
$time = null;
// 獲取當(dāng)前的時間
$mtime = date("Y-m-d h:i:s");
// 對ID為1 的文章進(jìn)行訪問量+1
$sql = "UPDATE `original` SET `visit`=`visit`+1, `mtime` = '{$mtime}' WHERE `article_id` = 1";
if (mysqli_query($db->link, $sql)){
? ? // 獲取ID為1 的文章最新數(shù)據(jù)鸣驱,輸出到前端
? ? $sql = 'SELECT * FROM `original` WHERE `article_id` = 1';
? ? $result = mysqli_query($db->link, $sql);
? ? while($row = mysqli_fetch_assoc($result)){
? ? ? ? $visit = $row['visit'];
? ? ? ? $time = $row['mtime'];
? ? }
}else{
? ? echo mysqli_error($db->link);
? ? die('執(zhí)行失敗');
}
?>
<!doctype html>
<html lang="zh-CN">
<head>
? ? <meta charset="UTF-8">
? ? <meta name="viewport"
? ? ? ? ? content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
? ? <meta http-equiv="X-UA-Compatible" content="ie=edge">
? ? <title>訪問量測試</title>
</head>
<body style="text-align: center">
? ? <p>
? ? ? ? 訪問量:<?php echo $visit ?>次
? ? </p>
? ? <p>
? ? ? ? 最后訪問時間:<?php echo $time ?>
? ? </p>
</body>
</html>
python 代碼
首先需要安裝python的一個Requests擴(kuò)展插件泛鸟。
Requests 是用 Python 語言編寫,基于 urllib踊东,采用 Apache2 Licensed 開源協(xié)議的 HTTP 庫北滥。它比 urllib 更加方便,可以節(jié)約我們大量的工作闸翅,完全滿足 HTTP 測試需求再芋。
通過 pip 安裝
pip install requests
或者,下載代碼后安裝:
$ git clone git://github.com/kennethreitz/requests.git
$ cd requests
$ python setup.py install
源代碼
import requests
import time
#? 目標(biāo)url地址
url = 'http://localhost/TrafficGenerator/original.php'
while 1:
? ? response = requests.get(url)
? ? response.close()
? ? print(response.text)
? ? # 間隔1秒
? ? time.sleep(1)
這就是比較簡單的方法坚冀。但是實(shí)際的應(yīng)用可能并不會這么簡單济赎。很多網(wǎng)站往往會過濾想通IP的訪問,這個時候就需要IP代理记某。
使用代理
requests對代理的設(shè)置方法非常的簡單司训。深入學(xué)習(xí)可以參考這里:https://www.cnblogs.com/zhaof/p/6915127.html
注意:本篇文章是在本地測試,本地測試使用的是本地地址液南,使用代理是無效的壳猜。
import requests
import time
import random
# 隨機(jī)獲取瀏覽器標(biāo)識
def get_UA():
? ? UA_list = [
? ? ? ? "Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19",
? ? ? ? "Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
? ? ? ? "Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
? ? ? ? "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0",
? ? ? ? "Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0",
? ? ? ? "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36"
? ? ]
? ? randnum = random.randint(0, len(UA_list)-1)
? ? h_list = {
? ? ? ? 'user-agent': UA_list[randnum]
? ? }
? ? return h_list
# 獲取代理IP
def get_ip():
? ? # 這里填寫大象代理api地址,num參數(shù)必須為1贺拣,每次只請求一個IP地址
? ? url = 'http://tvp.daxiangdaili.com/ip/?tid=你的訂單號&num=1&delay=5&category=2'
? ? response = requests.get(url)
? ? response.close()
? ? proxy = {
? ? ? ? "http":"http://"+response.text
? ? }
? ? print(proxy['http'])
? ? return proxy
if __name__ == '__main__':
? ? #? 目標(biāo)url地址
? ? url = 'http://localhost/TrafficGenerator/original.php'
? ? while 1:
? ? ? ? try:
? ? ? ? ? ? # 開啟一個會話
? ? ? ? ? ? s = requests.session()
? ? ? ? ? ? # 調(diào)用函數(shù)獲取瀏覽器標(biāo)識
? ? ? ? ? ? headers = get_UA()
? ? ? ? ? ? # 調(diào)用函數(shù)獲取IP代理地址
? ? ? ? ? ? proxy = get_ip()
? ? ? ? ? ? # 開始請求, 注意本地測試使用的是本地地址蓖谢,使用代理是無效的
? ? ? ? ? ? web_data = s.get(url, headers=headers, proxies=proxy)
? ? ? ? ? ? # 輸出網(wǎng)頁內(nèi)容
? ? ? ? ? ? print(web_data.content)
? ? ? ? ? ? # 間隔1秒
? ? ? ? ? ? time.sleep(1)
? ? ? ? finally:
? ? ? ? ? ? print('error')
系列教程: