前言
每當看到幾十萬的閱讀量的文章后面區區幾個評論, 心中就在想, 難道大家現在都這么懶了嗎? 但是有些文章閱讀量不高, 評論為什么這么多呢?
我想這些應該都是刷的, 不光瀏覽量是刷的, 甚至那些無厘頭的評論都是刷的。有人要問了, 你憑什么說別人刷的評論呢? 難道評論還可以刷? 我想說是的。
比如:我們在瀏覽微博的時候,會經常發現一件事, 怎么每個微博下面都有這個人的小廣告呢? 難道這人都這么閑嗎? 一個人閑也就罷了, 怎么這么多人都閑?可以在大量的微博下面評論大量的小廣告, 并且點贊還非常多。具體是不是刷的,自己做判斷就好了。
今天教大家的是, 用爬蟲通過代理來增加網頁的瀏覽量。以下是干貨↓
思路
一、怎么獲取大量的代理IP?
給大家推薦一個網站https://www.xicidaili.com/ , 看到下面的圖片, 應該明白我們要做什么了吧。我們可以寫一個爬蟲去抓取這些IP。
但是, 在實際運行的時候, 發現了一個問題, 我怎么才能知道這些IP有用, 并且代理設置成功了呢? 當然, 也是有解決方案的,我們可以用代理訪問這個網站http://httpbin.org/ip ,如果不正常會拋出異常, 如果是正常的就會返回如下信息
{ "origin": "106.38.91.34, 106.38.91.34" }
廢話不多說,直接上代碼:
from bs4 import BeautifulSoup import requests import random import time def download_page(url): print(url) try: #User Agent中文名為用戶代理,簡稱 UA,它是一個特殊字符串頭,使得服務器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本、 #瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。 header = { "User-Agent":"Mozilla/5.0 (windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/59.0.3071.104 Safari/537.36" } data = requests.get(url,headers=header).text except HTTPError as err: print(err.__traceback__) except ConnectionError as err: print(err.__traceback__) except TimeoutError as err: print(err.__traceback__) return data #獲取當前首頁的內容 def parse_proxy_html(html): try: #解析器html.parser lxml xml html5lib soup = BeautifulSoup(html, 'lxml') find_all = soup.find_all('tr') f = open("proxy", "w") for find_tr in find_all: find_tds = find_tr.find_all('td') if len(find_tds) == 0: continue ip_temp = find_tds[1].contents[0]+":"+find_tds[2].contents[0] try: #隨機模擬一個用戶 user_agent = {'User-Agent':random.choice(agent_list)} #隨機獲取一個代理ip proxies = {'http':ip_temp} #這樣寫沒有問題,但是抓取出來的ip大都沒有用 #判斷代理ip是否有用,只保存有用的代理ip,兩秒不響應就算無效的ip targetUrl = 'http://httpbin.org/ip' resp = requests.get(targetUrl, headers=user_agent,proxies=proxies,timeout=2) print(resp.status_code) print(resp.text) print('~~有效的~~代理ip和端口號%s'%ip_temp) f.write(ip_temp+"n") except Exception as e: print('~~異常:%s'%e) print('~~無效的~~代理ip和端口號%s'%ip_temp) #獲取下個頁面地址 next_a = soup.find('a',attrs={'rel': 'next'}) if next_a is None: print("~~None~~~") return ""; return next_a['href'] except Exception as ex: print('抓取信息異常:'+ex) #首頁數據抓取 HTTP = 'https://www.xicidaili.com' def to_proxy_page(): download_url = '/wt/1' num = 1 while download_url != 'JAVAscript:;' and download_url!='': if num == 3: print('~~~~夠用了~~不抓取了~~~') break print("第%d次請求地址:%s"%(num,download_url)); #隨機停頓幾秒 i = random.randint(1, 3) time.sleep(i) #獲取頁面信息 html = download_page(HTTP + download_url) #解析和保存 download_url = parse_proxy_html(html) num = num+1; if __name__ == '__main__': to_proxy_page()
獲取到的代理地址格式如下(想要多少, 代碼自己設置下就好了):
163.204.243.4:9999
60.13.42.248:9999
二、通過代理地址去刷新網頁
可以先寫一個User-Agent列表, 模擬不同的瀏覽器信息。然后配置需要刷新的網頁就好了。
import random import socket import requests #定義需要刷新的頁面集合 refreshPage_list = [ #1062 'https://blog.csdn.net/dujianxiong/article/details/80844652', #153 'https://blog.csdn.net/super_DuoLa/article/details/90205512' ] #定義User-Agent集合 agent_list = [ #Win7: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1', #Win7: 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0', #Win7: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50', #Win7: 'Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50', #Win7+ie9: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)', #Win7+ie8: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)', #WinXP+ie8: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)', #WinXP+ie7: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', #WinXP+ie6: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)', #傲游3.1.7在Win7+ie9,高速模式: 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12', #傲游3.1.7在Win7+ie9,IE內核兼容模式: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)', #搜狗3.0在Win7+ie9,IE內核兼容模式: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)', #搜狗3.0在Win7+ie9,高速模式: 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.33 Safari/534.3 SE 2.X MetaSr 1.0', #360瀏覽器3.0在Win7+ie9: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)', #QQ瀏覽器6.9(11079)在Win7+ie9,極速模式: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201', #QQ瀏覽器6.9(11079)在Win7+ie9,IE內核兼容模式: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E) QQBrowser/6.9.11079.201', #阿云瀏覽器1.3.0.1724 Beta(編譯日期2011-12-05)在Win7+ie9: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)' ] #開始搞 def to_refresh_page(): try: #獲取代理信息 f = open("proxy",'r') lines = f.readlines() proxys = [] for line in lines: ip = line.strip() proxys.append(ip) #每個頁面刷新10次 for i in range(10): for url in refreshPage_list: #隨機模擬一個用戶 user_agent = {'User-Agent':random.choice(agent_list)} #隨機獲取一個代理ip proxies = {'http':random.choice(proxys)} r = requests.get(url,headers=user_agent,proxies=proxies) print(r) print('刷新成功,請求地址url:%s返回狀態status:%s'%(url,r.status_code)) except Exception as e: print('刷新頁面異常:%s'%e) if __name__ == '__main__': to_refresh_page()
代碼中我加了很多注解,就不長篇大論了,如果有不明白的可以評論。
三、思考問題
在實際測試中,發現剛才還有效的代理IP,當去刷新網頁的時候就鏈接超時了呢?為什么請求了很多次,網頁的瀏覽量并沒有漲太多呢?
注: 文章所寫代碼僅用于技術交流