自動(dòng)采集編寫(xiě)
使用Python3編撰一個(gè)爬蟲(chóng)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 229 次瀏覽 ? 2020-08-23 07:12
使用Python3編撰一個(gè)爬蟲(chóng)需求簡(jiǎn)介
最近廠(chǎng)里有一個(gè)新聞采集類(lèi)的需求,細節大體如下:
模擬登陸一個(gè)外網(wǎng)網(wǎng)站(SSO)抓取新聞(支持代理服務(wù)器的形式訪(fǎng)問(wèn))加工內容款式,以適配手機屏幕將正文中的圖片轉存到自已的服務(wù)器,并替換img標簽中的url圖片儲存服務(wù)器須要復用已有的FastDFS分布式文件系統采集結果導出生產(chǎn)庫支持日志復印
初學(xué)Python3,正好用這個(gè)需求練練手,最后太吃驚的是只用200多行代碼就實(shí)現了,如果換成Java的話(huà)大約須要1200行吧。果然應了那句俗話(huà):人生苦短,我用Python
登錄頁(yè)面抓包
第一步其實(shí)是抓包,然后再按照抓到的內容,模擬進(jìn)行HTTP懇求。
常用的抓包工具,有Mac下的Charles和Windows下的Fiddler。
它們的原理都是在本機開(kāi)一個(gè)HTTP或SOCKS代理服務(wù)器端口,然后將瀏覽器的代理服務(wù)器設置成這個(gè)端口,這樣瀏覽器中所有的HTTP懇求就會(huì )先經(jīng)過(guò)抓包工具記錄出來(lái)了。
這里推薦盡量使用Fiddler,原因是Charles對于cookie的展示是有bug的,舉個(gè)事例,真實(shí)情況:請求A返回了LtpaToken這個(gè)cookie,請求B中返回了sid這個(gè)cookie。但在Charles中的展示是:請求A中早已同時(shí)返回了LtpaToken和sid兩個(gè)cookie,這就很容易欺騙人了。
另外Fiddler如今早已有了Linux的Beta版本,貌似是用類(lèi)似wine的形式實(shí)現的。
如果網(wǎng)站使用了單點(diǎn)登錄,可能會(huì )涉及到手工生成cookie。所以除了須要剖析每一條HTTP請求的request和response,以及帶回去的cookie,還要對頁(yè)面中的javascript進(jìn)行剖析,看一下是怎樣生成cookie的。
模擬登陸
將頁(yè)面剖析完畢以后,就可以進(jìn)行模擬HTTP懇求了。
這里有兩個(gè)非常好用的第三方庫, request 和 BeautifulSoup
requests 庫是拿來(lái)替代urllib的,可以十分人性化的的生成HTTP請求,模擬session以及偽造cookie更是便捷。
BeautifulSoup 用來(lái)取代re模塊,進(jìn)行HTML內容解析,可以用tag, class, id來(lái)定位想要提取的內容,也支持正則表達式等。
具體的使用方法直接看官方文檔就可以了,寫(xiě)的特別詳盡,這里直接給出地址:
requests官方文檔
BeautifulSoup官方文檔
通過(guò)pip3來(lái)安裝這兩個(gè)模塊:
sudo apt-get install python3-pip
sudo pip3 install requests
sudo pip3 install beautifulsoup4
導入模塊:
import requests
from bs4 import BeautifulSoup
模擬登陸:
def sso_login():
# 調用單點(diǎn)登錄工號認證頁(yè)面
response = session.post(const.SSO_URL,
data={'login': const.LOGIN_USERNAME, 'password': const.LOGIN_PASSWORD, 'appid': 'np000'})
# 分析頁(yè)面,取token及l(fā)tpa
soup = BeautifulSoup(response.text, 'html.parser')
token = soup.form.input.get('value')
ltpa = soup.form.input.input.input.get('value')
ltpa_value = ltpa.split(';')[0].split('=', 1)[1]
# 手工設置Cookie
session.cookies.set('LtpaToken', ltpa_value, domain='unicom.local', path='/')
# 調用云門(mén)戶(hù)登錄頁(yè)面(2次)
payload = {'token': token}
session.post(const.LOGIN_URL, data=payload, proxies=const.PROXIES)
response = session.post(const.LOGIN_URL, data=payload, proxies=const.PROXIES)
if response.text == "success":
logging.info("登錄成功")
return True
else:
logging.info("登錄失敗")
return False
這里用到了BeautifulSoup進(jìn)行HTML解析,取出頁(yè)面中的token、ltpa等數組。
然后使用session.cookies.set偽造了一個(gè)cookie,注意其中的domain參數,設置成1級域名。
然后用這個(gè)session,去調用網(wǎng)站頁(yè)面,換回sid這個(gè)token。并可以依據頁(yè)面的返回信息,來(lái)簡(jiǎn)單判定一下成功還是失敗。
列表頁(yè)面抓取
登錄成功以后,接下來(lái)的列表頁(yè)面抓取就要簡(jiǎn)單的多了,不考慮分頁(yè)的話(huà),直接取一個(gè)list下來(lái)遍歷即可。
def capture_list(list_url):
response = session.get(list_url, proxies=const.PROXIES)
response.encoding = "UTF-8"
soup = BeautifulSoup(response.text, 'html.parser')
news_list = soup.find('div', 'xinwen_list').find_all('a')
news_list.reverse()
logging.info("開(kāi)始采集")
for news_archor in news_list:
news_cid = news_archor.attrs['href'].split('=')[1]
capture_content(news_cid)
logging.info("結束采集")
這里使用了response.encoding = "UTF-8"來(lái)手工解決亂碼問(wèn)題。
新聞頁(yè)面抓取
新聞頁(yè)面抓取,涉及到插臨時(shí)表,這里沒(méi)有使用每三方庫,直接用SQL形式插入。
其中涉及到款式處理與圖片轉存,另寫(xiě)一個(gè)模塊pconvert來(lái)實(shí)現。
def capture_content(news_cid):
# 建立DB連接
conn = mysql.connector.connect(user=const.DB_USERNAME, password=const.DB_PASSWORD, host=const.DB_HOST,
port=const.DB_PORT, database=const.DB_DATABASE)
cursor = conn.cursor()
# 判斷是否已存在
cursor.execute('select count(*) from material_prepare where news_cid = %s', (news_cid,))
news_count = cursor.fetchone()[0]
if news_count > 0:
logging.info("采集" + news_cid + ':已存在')
else:
logging.info("采集" + news_cid + ':新增')
news_url = const.NEWS_BASE_URL + news_cid
response = session.post(news_url, proxies=const.PROXIES)
response.encoding = "UTF-8"
soup = BeautifulSoup(response.text, 'html.parser')
# logging.info(soup)
news_title = soup.h3.text.strip()[:64]
news_brief = soup.find('div', 'brief').p.text.strip()[:100]
news_author = soup.h5.span.a.text.strip()[:100]
news_content = soup.find('table', 'unis_detail_content').tr.td.prettify()[66:-7].strip()
# 樣式處理
news_content = pconvert.convert_style(news_content)
# 將圖片轉存至DFS并替換URL
news_content = pconvert.convert_img(news_content)
# 入表
cursor.execute(
'INSERT INTO material_prepare (news_cid, title, author, summary, content, add_time, status) VALUES (%s, %s, %s, %s, %s, now(), "0")'
, [news_cid, news_title, news_author, news_brief, news_content])
# 提交
conn.commit()
cursor.close()
樣式處理
文本式樣處理,還是要用到BeautifulSoup,因為原創(chuàng )站點(diǎn)上的新聞內容款式是五花八門(mén)的,根據實(shí)際情況,一邊寫(xiě)一個(gè)test函數來(lái)生成文本,一邊在瀏覽器上漸漸調試。
def convert_style(rawtext):
newtext = '' \
+ rawtext + ''
newtext = newtext.replace(' align="center"', '')
soup = BeautifulSoup(newtext, 'html.parser')
img_tags = soup.find_all("img")
for img_tag in img_tags:
del img_tag.parent['style']
return soup.prettify()
圖片轉存至DFS
因為原創(chuàng )站點(diǎn)是在外網(wǎng)中的,采集下來(lái)的HTML中,
標簽的地址是外網(wǎng)地址,所以在網(wǎng)段中是詮釋不下來(lái)的,需要將圖片轉存,并用新的URL替換原有的URL。
def convert_img(rawtext):
soup = BeautifulSoup(rawtext, 'html.parser')
img_tags = soup.find_all("img")
for img_tag in img_tags:
raw_img_url = img_tag['src']
dfs_img_url = convert_url(raw_img_url)
img_tag['src'] = dfs_img_url
del img_tag['style']
return soup.prettify()
圖片轉存最簡(jiǎn)單的形式是保存成本地的文件,然后再通過(guò)nginx或httpd服務(wù)將圖片開(kāi)放出去:
pic_name = raw_img_url.split('/')[-1]
pic_path = TMP_PATH + '/' + pic_name
with open(pic_path, 'wb') as pic_file:
pic_file.write(pic_content)
但這兒我們須要復用已有的FastDFS分布式文件系統,要用到它的一個(gè)客戶(hù)端的庫fdfs_client-py
fdfs_client-py不能直接使用pip3安裝,需要直接使用一個(gè)python3版的源碼,并手工更改其中代碼。操作過(guò)程如下:
git clone https://github.com/jefforeilly/fdfs_client-py.git
cd dfs_client-py
vi ./fdfs_client/storage_client.py
將第12行 from fdfs_client.sendfile import * 注釋掉
python3 setup.py install
sudo pip3 install mutagen
客戶(hù)端的使用上沒(méi)有哪些非常的,直接調用upload_by_buffer,傳一個(gè)圖片的buffer進(jìn)去就可以了,成功后會(huì )返回手動(dòng)生成的文件名。
from fdfs_client.client import *
dfs_client = Fdfs_client('conf/dfs.conf')
def convert_url(raw_img_url):
response = requests.get(raw_img_url, proxies=const.PROXIES)
pic_buffer = response.content
pic_ext = raw_img_url.split('.')[-1]
response = dfs_client.upload_by_buffer(pic_buffer, pic_ext)
dfs_img_url = const.DFS_BASE_URL + '/' + response['Remote file_id']
return dfs_img_url
其中dfs.conf文件中,主要就是配置一下 tracker_server
日志處理
這里使用配置文件的形式處理日志,類(lèi)似JAVA中的log4j吧,首先新建一個(gè)log.conf:
[loggers]
keys=root
[handlers]
keys=stream_handler,file_handler
[formatters]
keys=formatter
[logger_root]
level=DEBUG
handlers=stream_handler,file_handler
[handler_stream_handler]
class=StreamHandler
level=DEBUG
formatter=formatter
args=(sys.stderr,)
[handler_file_handler]
class=FileHandler
level=DEBUG
formatter=formatter
args=('logs/pspider.log','a','utf8')
[formatter_formatter]
format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s
這里通過(guò)配置handlers,可以同時(shí)將日志復印到stderr和文件。
注意args=('logs/pspider.log','a','utf8') 這一行,用來(lái)解決文本文件中的英文亂碼問(wèn)題。
日志初始化:
import logging
from logging.config import fileConfig
fileConfig('conf/log.conf')
日志復?。?br /> logging.info("test")
完整源碼
到此為止,就是怎樣用Python3寫(xiě)一個(gè)爬蟲(chóng)的全部過(guò)程了。
采集不同的站點(diǎn),肯定是要有不同的處理,但方式都是大同小異。 查看全部
使用Python3編撰一個(gè)爬蟲(chóng)
使用Python3編撰一個(gè)爬蟲(chóng)需求簡(jiǎn)介
最近廠(chǎng)里有一個(gè)新聞采集類(lèi)的需求,細節大體如下:
模擬登陸一個(gè)外網(wǎng)網(wǎng)站(SSO)抓取新聞(支持代理服務(wù)器的形式訪(fǎng)問(wèn))加工內容款式,以適配手機屏幕將正文中的圖片轉存到自已的服務(wù)器,并替換img標簽中的url圖片儲存服務(wù)器須要復用已有的FastDFS分布式文件系統采集結果導出生產(chǎn)庫支持日志復印
初學(xué)Python3,正好用這個(gè)需求練練手,最后太吃驚的是只用200多行代碼就實(shí)現了,如果換成Java的話(huà)大約須要1200行吧。果然應了那句俗話(huà):人生苦短,我用Python
登錄頁(yè)面抓包
第一步其實(shí)是抓包,然后再按照抓到的內容,模擬進(jìn)行HTTP懇求。
常用的抓包工具,有Mac下的Charles和Windows下的Fiddler。
它們的原理都是在本機開(kāi)一個(gè)HTTP或SOCKS代理服務(wù)器端口,然后將瀏覽器的代理服務(wù)器設置成這個(gè)端口,這樣瀏覽器中所有的HTTP懇求就會(huì )先經(jīng)過(guò)抓包工具記錄出來(lái)了。
這里推薦盡量使用Fiddler,原因是Charles對于cookie的展示是有bug的,舉個(gè)事例,真實(shí)情況:請求A返回了LtpaToken這個(gè)cookie,請求B中返回了sid這個(gè)cookie。但在Charles中的展示是:請求A中早已同時(shí)返回了LtpaToken和sid兩個(gè)cookie,這就很容易欺騙人了。
另外Fiddler如今早已有了Linux的Beta版本,貌似是用類(lèi)似wine的形式實(shí)現的。
如果網(wǎng)站使用了單點(diǎn)登錄,可能會(huì )涉及到手工生成cookie。所以除了須要剖析每一條HTTP請求的request和response,以及帶回去的cookie,還要對頁(yè)面中的javascript進(jìn)行剖析,看一下是怎樣生成cookie的。
模擬登陸
將頁(yè)面剖析完畢以后,就可以進(jìn)行模擬HTTP懇求了。
這里有兩個(gè)非常好用的第三方庫, request 和 BeautifulSoup
requests 庫是拿來(lái)替代urllib的,可以十分人性化的的生成HTTP請求,模擬session以及偽造cookie更是便捷。
BeautifulSoup 用來(lái)取代re模塊,進(jìn)行HTML內容解析,可以用tag, class, id來(lái)定位想要提取的內容,也支持正則表達式等。
具體的使用方法直接看官方文檔就可以了,寫(xiě)的特別詳盡,這里直接給出地址:
requests官方文檔
BeautifulSoup官方文檔
通過(guò)pip3來(lái)安裝這兩個(gè)模塊:
sudo apt-get install python3-pip
sudo pip3 install requests
sudo pip3 install beautifulsoup4
導入模塊:
import requests
from bs4 import BeautifulSoup
模擬登陸:
def sso_login():
# 調用單點(diǎn)登錄工號認證頁(yè)面
response = session.post(const.SSO_URL,
data={'login': const.LOGIN_USERNAME, 'password': const.LOGIN_PASSWORD, 'appid': 'np000'})
# 分析頁(yè)面,取token及l(fā)tpa
soup = BeautifulSoup(response.text, 'html.parser')
token = soup.form.input.get('value')
ltpa = soup.form.input.input.input.get('value')
ltpa_value = ltpa.split(';')[0].split('=', 1)[1]
# 手工設置Cookie
session.cookies.set('LtpaToken', ltpa_value, domain='unicom.local', path='/')
# 調用云門(mén)戶(hù)登錄頁(yè)面(2次)
payload = {'token': token}
session.post(const.LOGIN_URL, data=payload, proxies=const.PROXIES)
response = session.post(const.LOGIN_URL, data=payload, proxies=const.PROXIES)
if response.text == "success":
logging.info("登錄成功")
return True
else:
logging.info("登錄失敗")
return False
這里用到了BeautifulSoup進(jìn)行HTML解析,取出頁(yè)面中的token、ltpa等數組。
然后使用session.cookies.set偽造了一個(gè)cookie,注意其中的domain參數,設置成1級域名。
然后用這個(gè)session,去調用網(wǎng)站頁(yè)面,換回sid這個(gè)token。并可以依據頁(yè)面的返回信息,來(lái)簡(jiǎn)單判定一下成功還是失敗。
列表頁(yè)面抓取
登錄成功以后,接下來(lái)的列表頁(yè)面抓取就要簡(jiǎn)單的多了,不考慮分頁(yè)的話(huà),直接取一個(gè)list下來(lái)遍歷即可。
def capture_list(list_url):
response = session.get(list_url, proxies=const.PROXIES)
response.encoding = "UTF-8"
soup = BeautifulSoup(response.text, 'html.parser')
news_list = soup.find('div', 'xinwen_list').find_all('a')
news_list.reverse()
logging.info("開(kāi)始采集")
for news_archor in news_list:
news_cid = news_archor.attrs['href'].split('=')[1]
capture_content(news_cid)
logging.info("結束采集")
這里使用了response.encoding = "UTF-8"來(lái)手工解決亂碼問(wèn)題。
新聞頁(yè)面抓取
新聞頁(yè)面抓取,涉及到插臨時(shí)表,這里沒(méi)有使用每三方庫,直接用SQL形式插入。
其中涉及到款式處理與圖片轉存,另寫(xiě)一個(gè)模塊pconvert來(lái)實(shí)現。
def capture_content(news_cid):
# 建立DB連接
conn = mysql.connector.connect(user=const.DB_USERNAME, password=const.DB_PASSWORD, host=const.DB_HOST,
port=const.DB_PORT, database=const.DB_DATABASE)
cursor = conn.cursor()
# 判斷是否已存在
cursor.execute('select count(*) from material_prepare where news_cid = %s', (news_cid,))
news_count = cursor.fetchone()[0]
if news_count > 0:
logging.info("采集" + news_cid + ':已存在')
else:
logging.info("采集" + news_cid + ':新增')
news_url = const.NEWS_BASE_URL + news_cid
response = session.post(news_url, proxies=const.PROXIES)
response.encoding = "UTF-8"
soup = BeautifulSoup(response.text, 'html.parser')
# logging.info(soup)
news_title = soup.h3.text.strip()[:64]
news_brief = soup.find('div', 'brief').p.text.strip()[:100]
news_author = soup.h5.span.a.text.strip()[:100]
news_content = soup.find('table', 'unis_detail_content').tr.td.prettify()[66:-7].strip()
# 樣式處理
news_content = pconvert.convert_style(news_content)
# 將圖片轉存至DFS并替換URL
news_content = pconvert.convert_img(news_content)
# 入表
cursor.execute(
'INSERT INTO material_prepare (news_cid, title, author, summary, content, add_time, status) VALUES (%s, %s, %s, %s, %s, now(), "0")'
, [news_cid, news_title, news_author, news_brief, news_content])
# 提交
conn.commit()
cursor.close()
樣式處理
文本式樣處理,還是要用到BeautifulSoup,因為原創(chuàng )站點(diǎn)上的新聞內容款式是五花八門(mén)的,根據實(shí)際情況,一邊寫(xiě)一個(gè)test函數來(lái)生成文本,一邊在瀏覽器上漸漸調試。
def convert_style(rawtext):
newtext = '' \
+ rawtext + ''
newtext = newtext.replace(' align="center"', '')
soup = BeautifulSoup(newtext, 'html.parser')
img_tags = soup.find_all("img")
for img_tag in img_tags:
del img_tag.parent['style']
return soup.prettify()
圖片轉存至DFS
因為原創(chuàng )站點(diǎn)是在外網(wǎng)中的,采集下來(lái)的HTML中,
標簽的地址是外網(wǎng)地址,所以在網(wǎng)段中是詮釋不下來(lái)的,需要將圖片轉存,并用新的URL替換原有的URL。
def convert_img(rawtext):
soup = BeautifulSoup(rawtext, 'html.parser')
img_tags = soup.find_all("img")
for img_tag in img_tags:
raw_img_url = img_tag['src']
dfs_img_url = convert_url(raw_img_url)
img_tag['src'] = dfs_img_url
del img_tag['style']
return soup.prettify()
圖片轉存最簡(jiǎn)單的形式是保存成本地的文件,然后再通過(guò)nginx或httpd服務(wù)將圖片開(kāi)放出去:
pic_name = raw_img_url.split('/')[-1]
pic_path = TMP_PATH + '/' + pic_name
with open(pic_path, 'wb') as pic_file:
pic_file.write(pic_content)
但這兒我們須要復用已有的FastDFS分布式文件系統,要用到它的一個(gè)客戶(hù)端的庫fdfs_client-py
fdfs_client-py不能直接使用pip3安裝,需要直接使用一個(gè)python3版的源碼,并手工更改其中代碼。操作過(guò)程如下:
git clone https://github.com/jefforeilly/fdfs_client-py.git
cd dfs_client-py
vi ./fdfs_client/storage_client.py
將第12行 from fdfs_client.sendfile import * 注釋掉
python3 setup.py install
sudo pip3 install mutagen
客戶(hù)端的使用上沒(méi)有哪些非常的,直接調用upload_by_buffer,傳一個(gè)圖片的buffer進(jìn)去就可以了,成功后會(huì )返回手動(dòng)生成的文件名。
from fdfs_client.client import *
dfs_client = Fdfs_client('conf/dfs.conf')
def convert_url(raw_img_url):
response = requests.get(raw_img_url, proxies=const.PROXIES)
pic_buffer = response.content
pic_ext = raw_img_url.split('.')[-1]
response = dfs_client.upload_by_buffer(pic_buffer, pic_ext)
dfs_img_url = const.DFS_BASE_URL + '/' + response['Remote file_id']
return dfs_img_url
其中dfs.conf文件中,主要就是配置一下 tracker_server
日志處理
這里使用配置文件的形式處理日志,類(lèi)似JAVA中的log4j吧,首先新建一個(gè)log.conf:
[loggers]
keys=root
[handlers]
keys=stream_handler,file_handler
[formatters]
keys=formatter
[logger_root]
level=DEBUG
handlers=stream_handler,file_handler
[handler_stream_handler]
class=StreamHandler
level=DEBUG
formatter=formatter
args=(sys.stderr,)
[handler_file_handler]
class=FileHandler
level=DEBUG
formatter=formatter
args=('logs/pspider.log','a','utf8')
[formatter_formatter]
format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s
這里通過(guò)配置handlers,可以同時(shí)將日志復印到stderr和文件。
注意args=('logs/pspider.log','a','utf8') 這一行,用來(lái)解決文本文件中的英文亂碼問(wèn)題。
日志初始化:
import logging
from logging.config import fileConfig
fileConfig('conf/log.conf')
日志復?。?br /> logging.info("test")
完整源碼
到此為止,就是怎樣用Python3寫(xiě)一個(gè)爬蟲(chóng)的全部過(guò)程了。
采集不同的站點(diǎn),肯定是要有不同的處理,但方式都是大同小異。
Python爬蟲(chóng)建站入門(mén)雜記——從零開(kāi)始構建采集站點(diǎn)(二:編寫(xiě)爬蟲(chóng))
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 378 次瀏覽 ? 2020-08-23 06:51
上回,我裝了環(huán)境
也就是一對亂七八糟的東西
裝了pip,用pip裝了virtualenv,建立了一個(gè)virtualenv,在這個(gè)virtualenv上面,裝了Django,創(chuàng )建了一個(gè)Django項目,在這個(gè)Django項目上面創(chuàng )建了一個(gè)稱(chēng)作web的阿皮皮。
接上回~
第二部份,編寫(xiě)爬蟲(chóng)。
工欲善其事,必先利其器。
bashapt-get install vim # 接上回,我們在screen里面是root身份哦~
當然了,現在我要想一個(gè)采集的目標,為了便捷,我就選擇segmentfault吧,這網(wǎng)站寫(xiě)博客不錯,就是在海外上傳圖片有點(diǎn)慢。
這個(gè)爬蟲(chóng),就像我訪(fǎng)問(wèn)一樣,要分步驟來(lái)。 我先聽(tīng)到segmentfault首頁(yè),然后發(fā)覺(jué)上面有很多tags,每個(gè)tags下邊,才是一個(gè)一個(gè)的問(wèn)題的內容。
所以,爬蟲(chóng)也要分為這幾個(gè)步驟來(lái)寫(xiě)。 但是我要反著(zhù)寫(xiě),先寫(xiě)內容爬蟲(chóng),再寫(xiě)分類(lèi)爬蟲(chóng), 因為我想。
2.1 編寫(xiě)內容爬蟲(chóng)
首先,給爬蟲(chóng)構建個(gè)目錄,在項目上面和app同級,然后把這個(gè)目錄弄成一個(gè)python的package
bashmkdir ~/python_spider/sfspider
touch ~/python_spider/sfspider/__init__.py
以后,這個(gè)目錄就叫爬蟲(chóng)包了
在爬蟲(chóng)包上面構建一個(gè)spider.py拿來(lái)裝我的爬蟲(chóng)們
bashvim ~/python_spider/sfspider/spider.py
一個(gè)基本的爬蟲(chóng),只須要下邊幾行代碼:
?。ùa下邊會(huì )提供)
然后呢,就可以玩兒我們的“爬蟲(chóng)”了。
進(jìn)入python shell
python>>> from sfspider import spider
>>> s = spider.SegmentfaultQuestionSpider('1010000002542775')
>>> s.url
>>> 'http://segmentfault.com/q/1010000002542775'
>>> print s.dom('h1#questionTitle').text()
>>> 微信JS—SDK嵌套選擇圖片和上傳圖片接口,實(shí)現一鍵上傳圖片,遇到問(wèn)題
看吧,我如今早已可以通過(guò)爬蟲(chóng)獲取segmentfault的提問(wèn)標題了。下一步,為了簡(jiǎn)化代碼,我把標題,回答等等的屬性都寫(xiě)為這個(gè)蜘蛛的屬性。代碼如下
python# -*- coding: utf-8 -*-
import requests # requests作為我們的html客戶(hù)端
from pyquery import PyQuery as Pq # pyquery來(lái)操作dom
class SegmentfaultQuestionSpider(object):
def __init__(self, segmentfault_id): # 參數為在segmentfault上的id
self.url = 'http://segmentfault.com/q/{0}'.format(segmentfault_id)
self._dom = None # 弄個(gè)這個(gè)來(lái)緩存獲取到的html內容,一個(gè)蜘蛛應該之訪(fǎng)問(wèn)一次
@property
def dom(self): # 獲取html內容
if not self._dom:
document = requests.get(self.url)
document.encoding = 'utf-8'
self._dom = Pq(document.text)
return self._dom
@property
def title(self): # 讓方法可以通過(guò)s.title的方式訪(fǎng)問(wèn) 可以少打對括號
return self.dom('h1#questionTitle').text() # 關(guān)于選擇器可以參考css selector或者jquery selector, 它們在pyquery下幾乎都可以使用
@property
def content(self):
return self.dom('.question.fmt').html() # 直接獲取html 膽子就是大 以后再來(lái)過(guò)濾
@property
def answers(self):
return list(answer.html() for answer in self.dom('.answer.fmt').items()) # 記住,Pq實(shí)例的items方法是很有用的
@property
def tags(self):
return self.dom('ul.taglist--inline > li').text().split() # 獲取tags,這里直接用text方法,再切分就行了。一般只要是文字內容,而且文字內容自己沒(méi)有空格,逗號等,都可以這樣弄,省事。
然后,再把玩一下升級后的蜘蛛。
python>>> from sfspider import spider
>>> s = spider.SegmentfaultQuestionSpider('1010000002542775')
>>> print s.title
>>> 微信JS—SDK嵌套選擇圖片和上傳圖片接口,實(shí)現一鍵上傳圖片,遇到問(wèn)題
>>> print s.content
>>> # [故意省略] #
>>> for answer in s.answers
print answer
>>> # [故意省略] #
>>> print '/'.join(s.tags)
>>> 微信js-sdk/python/微信開(kāi)發(fā)/javascript
OK,現在我的蜘蛛玩上去更方便了。
2.2 編寫(xiě)分類(lèi)爬蟲(chóng)
下面,我要寫(xiě)一個(gè)抓取標簽頁(yè)面的問(wèn)題的爬蟲(chóng)。
代碼如下, 注意下邊的代碼是添加在已有代碼下邊的, 和之前的最后一行之間 要有兩個(gè)空行
pythonclass SegmentfaultTagSpider(object):
def __init__(self, tag_name, page=1):
self.url = 'http://segmentfault.com/t/%s?type=newest&page=%s' % (tag_name, page)
self.tag_name = tag_name
self.page = page
self._dom = None
@property
def dom(self):
if not self._dom:
document = requests.get(self.url)
document.encoding = 'utf-8'
self._dom = Pq(document.text)
self._dom.make_links_absolute(base_url="http://segmentfault.com/") # 相對鏈接變成絕對鏈接 爽
return self._dom
@property
def questions(self):
return [question.attr('href') for question in self.dom('h2.title > a').items()]
@property
def has_next_page(self): # 看看還有沒(méi)有下一頁(yè),這個(gè)有必要
return bool(self.dom('ul.pagination > li.next')) # 看看有木有下一頁(yè)
def next_page(self): # 把這個(gè)蜘蛛殺了, 產(chǎn)生一個(gè)新的蜘蛛 抓取下一頁(yè)。 由于這個(gè)本來(lái)就是個(gè)動(dòng)詞,所以就不加@property了
if self.has_next_page:
self.__init__(tag_name=self.tag_name ,page=self.page+1)
else:
return None
現在可以?xún)蓚€(gè)蜘蛛一起把玩了,就不貼出詳盡把玩過(guò)程了。。。
python>>> from sfspider import spider
>>> s = spider.SegmentfaultTagSpider('微信')
>>> question1 = s.questions[0]
>>> question_spider = spider.SegmentfaultQuestionSpider(question1.split('/')[-1])
>>> # [故意省略] #
想做竊賊站的,看到這兒基本上能夠搞下來(lái)了。 套個(gè)模板 加一個(gè)簡(jiǎn)單的腳本來(lái)接受和返回懇求就行了。
未完待續。 查看全部
Python爬蟲(chóng)建站入門(mén)雜記——從零開(kāi)始構建采集站點(diǎn)(二:編寫(xiě)爬蟲(chóng))
上回,我裝了環(huán)境
也就是一對亂七八糟的東西
裝了pip,用pip裝了virtualenv,建立了一個(gè)virtualenv,在這個(gè)virtualenv上面,裝了Django,創(chuàng )建了一個(gè)Django項目,在這個(gè)Django項目上面創(chuàng )建了一個(gè)稱(chēng)作web的阿皮皮。
接上回~
第二部份,編寫(xiě)爬蟲(chóng)。
工欲善其事,必先利其器。
bashapt-get install vim # 接上回,我們在screen里面是root身份哦~
當然了,現在我要想一個(gè)采集的目標,為了便捷,我就選擇segmentfault吧,這網(wǎng)站寫(xiě)博客不錯,就是在海外上傳圖片有點(diǎn)慢。
這個(gè)爬蟲(chóng),就像我訪(fǎng)問(wèn)一樣,要分步驟來(lái)。 我先聽(tīng)到segmentfault首頁(yè),然后發(fā)覺(jué)上面有很多tags,每個(gè)tags下邊,才是一個(gè)一個(gè)的問(wèn)題的內容。
所以,爬蟲(chóng)也要分為這幾個(gè)步驟來(lái)寫(xiě)。 但是我要反著(zhù)寫(xiě),先寫(xiě)內容爬蟲(chóng),再寫(xiě)分類(lèi)爬蟲(chóng), 因為我想。
2.1 編寫(xiě)內容爬蟲(chóng)
首先,給爬蟲(chóng)構建個(gè)目錄,在項目上面和app同級,然后把這個(gè)目錄弄成一個(gè)python的package
bashmkdir ~/python_spider/sfspider
touch ~/python_spider/sfspider/__init__.py
以后,這個(gè)目錄就叫爬蟲(chóng)包了
在爬蟲(chóng)包上面構建一個(gè)spider.py拿來(lái)裝我的爬蟲(chóng)們
bashvim ~/python_spider/sfspider/spider.py
一個(gè)基本的爬蟲(chóng),只須要下邊幾行代碼:
?。ùa下邊會(huì )提供)
然后呢,就可以玩兒我們的“爬蟲(chóng)”了。
進(jìn)入python shell
python>>> from sfspider import spider
>>> s = spider.SegmentfaultQuestionSpider('1010000002542775')
>>> s.url
>>> 'http://segmentfault.com/q/1010000002542775'
>>> print s.dom('h1#questionTitle').text()
>>> 微信JS—SDK嵌套選擇圖片和上傳圖片接口,實(shí)現一鍵上傳圖片,遇到問(wèn)題
看吧,我如今早已可以通過(guò)爬蟲(chóng)獲取segmentfault的提問(wèn)標題了。下一步,為了簡(jiǎn)化代碼,我把標題,回答等等的屬性都寫(xiě)為這個(gè)蜘蛛的屬性。代碼如下
python# -*- coding: utf-8 -*-
import requests # requests作為我們的html客戶(hù)端
from pyquery import PyQuery as Pq # pyquery來(lái)操作dom
class SegmentfaultQuestionSpider(object):
def __init__(self, segmentfault_id): # 參數為在segmentfault上的id
self.url = 'http://segmentfault.com/q/{0}'.format(segmentfault_id)
self._dom = None # 弄個(gè)這個(gè)來(lái)緩存獲取到的html內容,一個(gè)蜘蛛應該之訪(fǎng)問(wèn)一次
@property
def dom(self): # 獲取html內容
if not self._dom:
document = requests.get(self.url)
document.encoding = 'utf-8'
self._dom = Pq(document.text)
return self._dom
@property
def title(self): # 讓方法可以通過(guò)s.title的方式訪(fǎng)問(wèn) 可以少打對括號
return self.dom('h1#questionTitle').text() # 關(guān)于選擇器可以參考css selector或者jquery selector, 它們在pyquery下幾乎都可以使用
@property
def content(self):
return self.dom('.question.fmt').html() # 直接獲取html 膽子就是大 以后再來(lái)過(guò)濾
@property
def answers(self):
return list(answer.html() for answer in self.dom('.answer.fmt').items()) # 記住,Pq實(shí)例的items方法是很有用的
@property
def tags(self):
return self.dom('ul.taglist--inline > li').text().split() # 獲取tags,這里直接用text方法,再切分就行了。一般只要是文字內容,而且文字內容自己沒(méi)有空格,逗號等,都可以這樣弄,省事。
然后,再把玩一下升級后的蜘蛛。
python>>> from sfspider import spider
>>> s = spider.SegmentfaultQuestionSpider('1010000002542775')
>>> print s.title
>>> 微信JS—SDK嵌套選擇圖片和上傳圖片接口,實(shí)現一鍵上傳圖片,遇到問(wèn)題
>>> print s.content
>>> # [故意省略] #
>>> for answer in s.answers
print answer
>>> # [故意省略] #
>>> print '/'.join(s.tags)
>>> 微信js-sdk/python/微信開(kāi)發(fā)/javascript
OK,現在我的蜘蛛玩上去更方便了。
2.2 編寫(xiě)分類(lèi)爬蟲(chóng)
下面,我要寫(xiě)一個(gè)抓取標簽頁(yè)面的問(wèn)題的爬蟲(chóng)。
代碼如下, 注意下邊的代碼是添加在已有代碼下邊的, 和之前的最后一行之間 要有兩個(gè)空行
pythonclass SegmentfaultTagSpider(object):
def __init__(self, tag_name, page=1):
self.url = 'http://segmentfault.com/t/%s?type=newest&page=%s' % (tag_name, page)
self.tag_name = tag_name
self.page = page
self._dom = None
@property
def dom(self):
if not self._dom:
document = requests.get(self.url)
document.encoding = 'utf-8'
self._dom = Pq(document.text)
self._dom.make_links_absolute(base_url="http://segmentfault.com/") # 相對鏈接變成絕對鏈接 爽
return self._dom
@property
def questions(self):
return [question.attr('href') for question in self.dom('h2.title > a').items()]
@property
def has_next_page(self): # 看看還有沒(méi)有下一頁(yè),這個(gè)有必要
return bool(self.dom('ul.pagination > li.next')) # 看看有木有下一頁(yè)
def next_page(self): # 把這個(gè)蜘蛛殺了, 產(chǎn)生一個(gè)新的蜘蛛 抓取下一頁(yè)。 由于這個(gè)本來(lái)就是個(gè)動(dòng)詞,所以就不加@property了
if self.has_next_page:
self.__init__(tag_name=self.tag_name ,page=self.page+1)
else:
return None
現在可以?xún)蓚€(gè)蜘蛛一起把玩了,就不貼出詳盡把玩過(guò)程了。。。
python>>> from sfspider import spider
>>> s = spider.SegmentfaultTagSpider('微信')
>>> question1 = s.questions[0]
>>> question_spider = spider.SegmentfaultQuestionSpider(question1.split('/')[-1])
>>> # [故意省略] #
想做竊賊站的,看到這兒基本上能夠搞下來(lái)了。 套個(gè)模板 加一個(gè)簡(jiǎn)單的腳本來(lái)接受和返回懇求就行了。
未完待續。
爬蟲(chóng) 大規模數據 采集心得和示例
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 397 次瀏覽 ? 2020-08-23 04:03
本篇主要介紹網(wǎng)站數據特別大的采集心得
1. 什么樣的數據能夠稱(chēng)為數據量大:
我認為這個(gè)可能會(huì )由于每位人的理解不太一樣,給出的定義 也不相同。我覺(jué)得定義一個(gè)采集網(wǎng)站的數據大小,不僅僅要看這個(gè)網(wǎng)站包括的數據量的大小,還應當包括這個(gè)網(wǎng)址的采集難度,采集網(wǎng)站的服務(wù)器承受能力,采集人員所調配的網(wǎng)路帶寬和計算機硬件資源等。這里我暫且把一個(gè)網(wǎng)站超過(guò)一千萬(wàn)個(gè)URL鏈接的稱(chēng)作數據量大的網(wǎng)站。
2. 數據量大的網(wǎng)站采集方案:
2.1 . 采集需求剖析:
作為數據采集工程師,我覺(jué)得最重要的是要做好數據采集的需求剖析,首先要預估這個(gè)網(wǎng)址的數據量大小,然后去明晰采集哪些數據,有沒(méi)有必要去把目標網(wǎng)站的數據都采集下來(lái),因為采集的數據量越多,耗費的時(shí)間就越多,需要的資源就越多,對目標網(wǎng)站造成的壓力就越大,數據采集工程師不能為了采集數據,對目標網(wǎng)站造成很大的壓力。原則是盡量少采集數據來(lái)滿(mǎn)足自己的需求,避免全站采集。
2.2. 代碼編撰:
因為要采集的網(wǎng)站數據好多,所以要求編撰的代碼做到穩定運行一周甚至一個(gè)月以上,所以代碼要足夠的強壯,足夠的強大。一般要求做到網(wǎng)站不變更模板,程序能始終執行出來(lái)。這里有個(gè)編程的小技巧,我覺(jué)得很重要,就是代碼編撰好之后,先去跑一兩個(gè)小時(shí),發(fā)現程序的一些報錯的地方,修改掉,這樣的前期代碼測試,能保證代碼的健壯性。
2.3 數據儲存:
當數據量有三五千萬(wàn)的時(shí)侯,無(wú)論是MySQL還是Oracle還是SQL Server,想在一個(gè)表上面儲存,已經(jīng)不太可能了,這個(gè)時(shí)侯可以采用分表來(lái)儲存。數據采集完畢,往數據庫插入的時(shí)侯,可以執行批量插入等策略。保證自己的儲存不受數據庫性能等方面的影響。
2.4 調配的資源:
由于目標網(wǎng)站數據好多,我們免不了要去使用大的房貸,內存,CPU等資源,這個(gè)時(shí)侯我們可以搞一個(gè)分布式爬蟲(chóng)系統,來(lái)合理的管理我們的資源。
3. 爬蟲(chóng)的道德
對于一些中級的采集工程師,為了更快的采集到數據,往往開(kāi)了好多的多進(jìn)程和多線(xiàn)程,后果就是對目標網(wǎng)站造成了dos攻擊,結果是目標網(wǎng)站果斷的升級網(wǎng)站,加入更多的反爬策略,這種對抗對采集工程師也是非常不利的。個(gè)人建議下載速率不要超過(guò)2M,多進(jìn)程或則多線(xiàn)程不要過(guò)百。
示例:
要采集的目標網(wǎng)站有四千萬(wàn)數據,網(wǎng)站的反爬策略是封ip,于是專(zhuān)門(mén)找了一臺機器,開(kāi)了二百多個(gè)進(jìn)程去維護ip池,ip池可用的ip在500-1000個(gè),并且保證ip是高度可用的。
代碼編撰完畢后,同是在兩臺機器上運行,每天機器開(kāi)啟的多線(xiàn)程不超過(guò)64個(gè),下載速率不超過(guò)1M.
個(gè)人知識有限,請大牛多多包涵 查看全部
爬蟲(chóng) 大規模數據 采集心得和示例
本篇主要介紹網(wǎng)站數據特別大的采集心得
1. 什么樣的數據能夠稱(chēng)為數據量大:
我認為這個(gè)可能會(huì )由于每位人的理解不太一樣,給出的定義 也不相同。我覺(jué)得定義一個(gè)采集網(wǎng)站的數據大小,不僅僅要看這個(gè)網(wǎng)站包括的數據量的大小,還應當包括這個(gè)網(wǎng)址的采集難度,采集網(wǎng)站的服務(wù)器承受能力,采集人員所調配的網(wǎng)路帶寬和計算機硬件資源等。這里我暫且把一個(gè)網(wǎng)站超過(guò)一千萬(wàn)個(gè)URL鏈接的稱(chēng)作數據量大的網(wǎng)站。
2. 數據量大的網(wǎng)站采集方案:
2.1 . 采集需求剖析:
作為數據采集工程師,我覺(jué)得最重要的是要做好數據采集的需求剖析,首先要預估這個(gè)網(wǎng)址的數據量大小,然后去明晰采集哪些數據,有沒(méi)有必要去把目標網(wǎng)站的數據都采集下來(lái),因為采集的數據量越多,耗費的時(shí)間就越多,需要的資源就越多,對目標網(wǎng)站造成的壓力就越大,數據采集工程師不能為了采集數據,對目標網(wǎng)站造成很大的壓力。原則是盡量少采集數據來(lái)滿(mǎn)足自己的需求,避免全站采集。
2.2. 代碼編撰:
因為要采集的網(wǎng)站數據好多,所以要求編撰的代碼做到穩定運行一周甚至一個(gè)月以上,所以代碼要足夠的強壯,足夠的強大。一般要求做到網(wǎng)站不變更模板,程序能始終執行出來(lái)。這里有個(gè)編程的小技巧,我覺(jué)得很重要,就是代碼編撰好之后,先去跑一兩個(gè)小時(shí),發(fā)現程序的一些報錯的地方,修改掉,這樣的前期代碼測試,能保證代碼的健壯性。
2.3 數據儲存:
當數據量有三五千萬(wàn)的時(shí)侯,無(wú)論是MySQL還是Oracle還是SQL Server,想在一個(gè)表上面儲存,已經(jīng)不太可能了,這個(gè)時(shí)侯可以采用分表來(lái)儲存。數據采集完畢,往數據庫插入的時(shí)侯,可以執行批量插入等策略。保證自己的儲存不受數據庫性能等方面的影響。
2.4 調配的資源:
由于目標網(wǎng)站數據好多,我們免不了要去使用大的房貸,內存,CPU等資源,這個(gè)時(shí)侯我們可以搞一個(gè)分布式爬蟲(chóng)系統,來(lái)合理的管理我們的資源。
3. 爬蟲(chóng)的道德
對于一些中級的采集工程師,為了更快的采集到數據,往往開(kāi)了好多的多進(jìn)程和多線(xiàn)程,后果就是對目標網(wǎng)站造成了dos攻擊,結果是目標網(wǎng)站果斷的升級網(wǎng)站,加入更多的反爬策略,這種對抗對采集工程師也是非常不利的。個(gè)人建議下載速率不要超過(guò)2M,多進(jìn)程或則多線(xiàn)程不要過(guò)百。
示例:

要采集的目標網(wǎng)站有四千萬(wàn)數據,網(wǎng)站的反爬策略是封ip,于是專(zhuān)門(mén)找了一臺機器,開(kāi)了二百多個(gè)進(jìn)程去維護ip池,ip池可用的ip在500-1000個(gè),并且保證ip是高度可用的。
代碼編撰完畢后,同是在兩臺機器上運行,每天機器開(kāi)啟的多線(xiàn)程不超過(guò)64個(gè),下載速率不超過(guò)1M.
個(gè)人知識有限,請大牛多多包涵
[Android]橘子視頻。e4a源碼+成品。采集360可看全網(wǎng)vip影片
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 812 次瀏覽 ? 2020-08-22 18:54
源碼我更改成黑色的了。改動(dòng)比較大。但源碼只發(fā)布原版。需要自己改。數據手動(dòng)采集360影視,解析插口自己找。論壇不知道能不能發(fā)布插口。這次先不發(fā),后期單獨發(fā)一貼.各大平臺影片基本都能解下來(lái)
安裝須要虛擬空間安裝網(wǎng)站,注冊用戶(hù)。和對接APP驗證。
類(lèi)庫齊全
藍奏云下載地址
*********源碼在最下邊*************
這個(gè)程序修補了好多個(gè)BUG目前是沒(méi)有BUG的,而且都是可以看的,用的是內置瀏覽器播放器可以無(wú)視廣告,帶充值卡,充值卡后臺自己設置,自己定價(jià),自己決定充值卡的名子,帶一鍵分享功能和用戶(hù)中心功能,完全仿造原生主流APP而做,界面完美無(wú)錯!
?。蓲赍X(qián))影視app源碼可注冊登錄帶后臺,批量生成卡密在線(xiàn)授權可設置試看時(shí)間
?。蓲赍X(qián))影視app源碼帶后臺,批量生成卡密在線(xiàn)授權可設置試看時(shí)間,試看時(shí)間可以隨時(shí)修改,很方便,后臺可以直接管理用戶(hù)
支持批量生成卡密,用戶(hù)使用卡密可以直接授權
卡密的時(shí)間由你設定,收不收費你說(shuō)了算
可以設置綁定IP或則綁定機器碼,就是說(shuō)換了手機之前的帳號不能使用,防止一號多用
***************************************************
查看全部
[Android]橘子視頻。e4a源碼+成品。采集360可看全網(wǎng)vip影片
源碼我更改成黑色的了。改動(dòng)比較大。但源碼只發(fā)布原版。需要自己改。數據手動(dòng)采集360影視,解析插口自己找。論壇不知道能不能發(fā)布插口。這次先不發(fā),后期單獨發(fā)一貼.各大平臺影片基本都能解下來(lái)
安裝須要虛擬空間安裝網(wǎng)站,注冊用戶(hù)。和對接APP驗證。
類(lèi)庫齊全
藍奏云下載地址
*********源碼在最下邊*************
這個(gè)程序修補了好多個(gè)BUG目前是沒(méi)有BUG的,而且都是可以看的,用的是內置瀏覽器播放器可以無(wú)視廣告,帶充值卡,充值卡后臺自己設置,自己定價(jià),自己決定充值卡的名子,帶一鍵分享功能和用戶(hù)中心功能,完全仿造原生主流APP而做,界面完美無(wú)錯!
?。蓲赍X(qián))影視app源碼可注冊登錄帶后臺,批量生成卡密在線(xiàn)授權可設置試看時(shí)間
?。蓲赍X(qián))影視app源碼帶后臺,批量生成卡密在線(xiàn)授權可設置試看時(shí)間,試看時(shí)間可以隨時(shí)修改,很方便,后臺可以直接管理用戶(hù)
支持批量生成卡密,用戶(hù)使用卡密可以直接授權
卡密的時(shí)間由你設定,收不收費你說(shuō)了算
可以設置綁定IP或則綁定機器碼,就是說(shuō)換了手機之前的帳號不能使用,防止一號多用
***************************************************

[雜談]關(guān)于報刀機器人是手動(dòng)搜集刀數嗎?(不做了,被團扇亂殺)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 189 次瀏覽 ? 2020-08-22 15:21
2020-07-01 19:42
[雜談]關(guān)于報刀機器人是手動(dòng)搜集刀數嗎?(不做了,被團扇亂殺)
就是會(huì )里打了boss,機器人就手動(dòng)記錄誰(shuí)誰(shuí)出了第幾刀,傷害多少。 還是須要會(huì )員自己去群里報刀?[s:ac:暈]
如果是自己去報刀,那捉魚(yú)的不捉魚(yú)的不是就全靠自覺(jué)了嘛。[s:ac:呆]
現在可以做到爬取游戲里的實(shí)時(shí)數據嗎?最近想試試自己搭個(gè)機器人。主要是為了那個(gè)但求每晚出滿(mǎn)三刀幫會(huì )用的。[s:ac:哭笑]
補充:主要啊[s:ac:擦汗]咸魚(yú)幫會(huì )只有每晚出滿(mǎn)三刀這個(gè)要求,1w開(kāi)外那個(gè),昨天9點(diǎn)多了還有7個(gè)人沒(méi)出刀,大家出沒(méi)出滿(mǎn)3刀也不清楚,作為會(huì )長(cháng)我就只有自己用紙筆逐個(gè)記錄對比,看看誰(shuí)誰(shuí)沒(méi)打,沒(méi)出刀,怪累的,才想問(wèn)問(wèn)的,看來(lái)實(shí)現上去還是有點(diǎn)困難[s:a2:不活了]
不過(guò)我還是先試試吧,明天再改改
好吧,基本做出來(lái)了[s:ac:擦汗]不過(guò)還是有很多麻煩,等會(huì )我發(fā)圖瞧瞧療效
2020.7.3更新目前實(shí)現了對截圖的數據進(jìn)行剖析,俗話(huà)說(shuō)小數據剖析[s:ac:哭笑]
分離提純我們須要的信息,然后寫(xiě)入數據庫篩選,最后再輸出
這個(gè)是截圖保存位置,目前實(shí)現了手動(dòng)截圖,也就是說(shuō)只要號仍然在線(xiàn)視奸,然后定時(shí)或則主動(dòng)截圖,程序都會(huì )辨識讀取
這個(gè)是輸出,就詳盡的篩選了玩家名子和對應的出刀次數
其實(shí)數據庫的話(huà),是記錄了boss和傷害的,但是俺們休閑幫會(huì )用不上,就沒(méi)必要輸出了[s:ac:哭笑](休閑幫會(huì )傷害是真的不能看)
功能的話(huà)基本上實(shí)現了,只是要正常運作的話(huà)難度還是很大了,首先得保證有號仍然在線(xiàn)而且在工會(huì )戰頁(yè)面,就這一個(gè)條件就太嚴苛了
只要這個(gè)條件能達成的話(huà),其他都不是事了,配合QQ機器人,定時(shí)截圖或則發(fā)送QQ信息截圖,然后統計信息就很簡(jiǎn)單了
只能說(shuō)有看法,但不成熟啊[s:ac:冷]附件
附件改動(dòng) 查看全部
[雜談]關(guān)于報刀機器人是手動(dòng)搜集刀數嗎?(不做了,被團扇亂殺)
2020-07-01 19:42
[雜談]關(guān)于報刀機器人是手動(dòng)搜集刀數嗎?(不做了,被團扇亂殺)
就是會(huì )里打了boss,機器人就手動(dòng)記錄誰(shuí)誰(shuí)出了第幾刀,傷害多少。 還是須要會(huì )員自己去群里報刀?[s:ac:暈]
如果是自己去報刀,那捉魚(yú)的不捉魚(yú)的不是就全靠自覺(jué)了嘛。[s:ac:呆]
現在可以做到爬取游戲里的實(shí)時(shí)數據嗎?最近想試試自己搭個(gè)機器人。主要是為了那個(gè)但求每晚出滿(mǎn)三刀幫會(huì )用的。[s:ac:哭笑]
補充:主要啊[s:ac:擦汗]咸魚(yú)幫會(huì )只有每晚出滿(mǎn)三刀這個(gè)要求,1w開(kāi)外那個(gè),昨天9點(diǎn)多了還有7個(gè)人沒(méi)出刀,大家出沒(méi)出滿(mǎn)3刀也不清楚,作為會(huì )長(cháng)我就只有自己用紙筆逐個(gè)記錄對比,看看誰(shuí)誰(shuí)沒(méi)打,沒(méi)出刀,怪累的,才想問(wèn)問(wèn)的,看來(lái)實(shí)現上去還是有點(diǎn)困難[s:a2:不活了]
不過(guò)我還是先試試吧,明天再改改
好吧,基本做出來(lái)了[s:ac:擦汗]不過(guò)還是有很多麻煩,等會(huì )我發(fā)圖瞧瞧療效
2020.7.3更新目前實(shí)現了對截圖的數據進(jìn)行剖析,俗話(huà)說(shuō)小數據剖析[s:ac:哭笑]
分離提純我們須要的信息,然后寫(xiě)入數據庫篩選,最后再輸出
這個(gè)是截圖保存位置,目前實(shí)現了手動(dòng)截圖,也就是說(shuō)只要號仍然在線(xiàn)視奸,然后定時(shí)或則主動(dòng)截圖,程序都會(huì )辨識讀取
這個(gè)是輸出,就詳盡的篩選了玩家名子和對應的出刀次數
其實(shí)數據庫的話(huà),是記錄了boss和傷害的,但是俺們休閑幫會(huì )用不上,就沒(méi)必要輸出了[s:ac:哭笑](休閑幫會(huì )傷害是真的不能看)
功能的話(huà)基本上實(shí)現了,只是要正常運作的話(huà)難度還是很大了,首先得保證有號仍然在線(xiàn)而且在工會(huì )戰頁(yè)面,就這一個(gè)條件就太嚴苛了
只要這個(gè)條件能達成的話(huà),其他都不是事了,配合QQ機器人,定時(shí)截圖或則發(fā)送QQ信息截圖,然后統計信息就很簡(jiǎn)單了
只能說(shuō)有看法,但不成熟啊[s:ac:冷]附件



附件改動(dòng)
【web系統UI自動(dòng)化】關(guān)于UI自動(dòng)化的總結
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 257 次瀏覽 ? 2020-08-22 12:44
實(shí)施過(guò)了web系統的UI自動(dòng)化,回顧梳理下,想到哪些寫(xiě)哪些,隨時(shí)補充。
首先,自動(dòng)化測試不是自動(dòng)測試的替代品,是比較好的補充,而且不是占大比重的補充。
70%的測試工作集中在底層接口測試和單元測試,20%的測試工作為集成測試,其他10%的測試即為界面測試。
開(kāi)發(fā)方向:盡可能的相通的模塊,通用的封裝開(kāi)發(fā)約定好,便于定位適用兼容測試無(wú)界面運行快速定位問(wèn)題:報錯信息、錯誤截圖多環(huán)境利潤點(diǎn)腳本開(kāi)發(fā)時(shí)間和復用次數快速驗證,第一時(shí)間響應問(wèn)題還可以做什么?兼容性多環(huán)境以便快速定位提煉更多通用模塊。調研更優(yōu)解決方案,比如:cypress等case依賴(lài)優(yōu)化深度校準什么樣的項目適宜web自動(dòng)化系統穩定,太多的制止程序或修改。準備之前,先手工測試,確認手動(dòng)測試可以囊括的系統功能。需要多系統,多瀏覽器兼容性測試什么樣的功能點(diǎn)須要web自動(dòng)化主業(yè)務(wù)流程便于實(shí)現自動(dòng)化的web元素、頁(yè)面重復量大的功能web自動(dòng)化常見(jiàn)的驗證點(diǎn)頁(yè)面元素驗證頁(yè)面列表數據驗證頁(yè)面元素屬性?UI的文本,圖片顯示正確性UI的交互邏輯正確性測試UI上的用戶(hù)行為正確性測試對于web自動(dòng)化框架常見(jiàn)的需求點(diǎn)分布式執行,可以多機器,多瀏覽器同步執行腳本適用于不同環(huán)境運行分層設計,方便維護生成測試報告模塊的復用必要的日志采集UI自動(dòng)化利潤點(diǎn)的采集回歸測試須要定期運行,在自動(dòng)化時(shí),它們可以節約測試人員的時(shí)間,我們可以更專(zhuān)注于其他場(chǎng)景和探索性測試。腳本開(kāi)發(fā)時(shí)間和復用次數誤報頻度UI自動(dòng)化缺點(diǎn)or局限不能快速反饋(相對于單元測試和API測試)只會(huì )對于case已確定的內容進(jìn)行校準運行的穩定性發(fā)覺(jué)的錯誤不多,大多數錯誤其實(shí)是通過(guò)“意外”或進(jìn)行探索性測試而發(fā)覺(jué)的。這可能是因為在每位探索性測試會(huì )話(huà)期間,我們可能以不同的方法測試應用程序,從而通過(guò)應用程序找到新的漏洞。編寫(xiě)優(yōu)秀且穩定的XPath / CSS定位器所耗費的時(shí)間,并在底層HTML標記發(fā)生變化時(shí)更新它們。UI本身的變化性,要想達到和手工測試相同的覆蓋率,投入比較大。如何進(jìn)行CI(Continuous Integration),也就是持續集成
● 持續提交代碼 (Check-in)
○ 一天之中多次提交
● 持續構建代碼 (Build)
○ 保證在任何時(shí)刻代碼是可以繼續開(kāi)發(fā)的
● 持續部署代碼 (Deploy)
○ 保證始終有一個(gè)可以部署的版本
● 持續測試代碼 (Test)
○ 每次提交均執行單元測試
○ 每天一次或數次集成測試
○ 每天一次或數次系統測試
不過(guò),高頻的集成,還是用插口愈發(fā)合適,后面的工作會(huì )把系統的交互插口自動(dòng)化,屆時(shí)分享。 查看全部
【web系統UI自動(dòng)化】關(guān)于UI自動(dòng)化的總結

實(shí)施過(guò)了web系統的UI自動(dòng)化,回顧梳理下,想到哪些寫(xiě)哪些,隨時(shí)補充。
首先,自動(dòng)化測試不是自動(dòng)測試的替代品,是比較好的補充,而且不是占大比重的補充。
70%的測試工作集中在底層接口測試和單元測試,20%的測試工作為集成測試,其他10%的測試即為界面測試。
開(kāi)發(fā)方向:盡可能的相通的模塊,通用的封裝開(kāi)發(fā)約定好,便于定位適用兼容測試無(wú)界面運行快速定位問(wèn)題:報錯信息、錯誤截圖多環(huán)境利潤點(diǎn)腳本開(kāi)發(fā)時(shí)間和復用次數快速驗證,第一時(shí)間響應問(wèn)題還可以做什么?兼容性多環(huán)境以便快速定位提煉更多通用模塊。調研更優(yōu)解決方案,比如:cypress等case依賴(lài)優(yōu)化深度校準什么樣的項目適宜web自動(dòng)化系統穩定,太多的制止程序或修改。準備之前,先手工測試,確認手動(dòng)測試可以囊括的系統功能。需要多系統,多瀏覽器兼容性測試什么樣的功能點(diǎn)須要web自動(dòng)化主業(yè)務(wù)流程便于實(shí)現自動(dòng)化的web元素、頁(yè)面重復量大的功能web自動(dòng)化常見(jiàn)的驗證點(diǎn)頁(yè)面元素驗證頁(yè)面列表數據驗證頁(yè)面元素屬性?UI的文本,圖片顯示正確性UI的交互邏輯正確性測試UI上的用戶(hù)行為正確性測試對于web自動(dòng)化框架常見(jiàn)的需求點(diǎn)分布式執行,可以多機器,多瀏覽器同步執行腳本適用于不同環(huán)境運行分層設計,方便維護生成測試報告模塊的復用必要的日志采集UI自動(dòng)化利潤點(diǎn)的采集回歸測試須要定期運行,在自動(dòng)化時(shí),它們可以節約測試人員的時(shí)間,我們可以更專(zhuān)注于其他場(chǎng)景和探索性測試。腳本開(kāi)發(fā)時(shí)間和復用次數誤報頻度UI自動(dòng)化缺點(diǎn)or局限不能快速反饋(相對于單元測試和API測試)只會(huì )對于case已確定的內容進(jìn)行校準運行的穩定性發(fā)覺(jué)的錯誤不多,大多數錯誤其實(shí)是通過(guò)“意外”或進(jìn)行探索性測試而發(fā)覺(jué)的。這可能是因為在每位探索性測試會(huì )話(huà)期間,我們可能以不同的方法測試應用程序,從而通過(guò)應用程序找到新的漏洞。編寫(xiě)優(yōu)秀且穩定的XPath / CSS定位器所耗費的時(shí)間,并在底層HTML標記發(fā)生變化時(shí)更新它們。UI本身的變化性,要想達到和手工測試相同的覆蓋率,投入比較大。如何進(jìn)行CI(Continuous Integration),也就是持續集成
● 持續提交代碼 (Check-in)
○ 一天之中多次提交
● 持續構建代碼 (Build)
○ 保證在任何時(shí)刻代碼是可以繼續開(kāi)發(fā)的
● 持續部署代碼 (Deploy)
○ 保證始終有一個(gè)可以部署的版本
● 持續測試代碼 (Test)
○ 每次提交均執行單元測試
○ 每天一次或數次集成測試
○ 每天一次或數次系統測試
不過(guò),高頻的集成,還是用插口愈發(fā)合適,后面的工作會(huì )把系統的交互插口自動(dòng)化,屆時(shí)分享。
用Python爬蟲(chóng)實(shí)現圖片手動(dòng)下載的方式
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 238 次瀏覽 ? 2020-08-21 18:12
爬蟲(chóng)的出現,可以乘以許多重復性的工作,在須要大量采集數據時(shí),爬蟲(chóng)可以實(shí)現手動(dòng)下載,極大的提升了工作效率。那么python如何實(shí)現圖片手動(dòng)下載的呢?如何借助python寫(xiě)爬蟲(chóng)?本文為你們介紹了用Python爬蟲(chóng)實(shí)現圖片手動(dòng)下載的方式。
1.分析需求
比如上百度找圖片,可以通過(guò)搜索功能,查找圖片后,選中其中一個(gè)查看源代碼,找到圖片對應的源代碼,如果圖片多地址,比如有thumbURL,middleURL,hoverURL,objURL,分別打開(kāi)看那個(gè)圖片符合需求。如果objURL符合需求,格式為.jpg。
2.選擇python庫
選擇2個(gè)包,一個(gè)是正則,一個(gè)是requests包。
3.編寫(xiě)代碼
復制百度圖片搜索的鏈接,傳入requests,然后把正則表達式寫(xiě)好。
因為有很多張圖片,所以要循環(huán),我們復印出結果來(lái)瞧瞧,然后用requests獲取網(wǎng)址,由于有些圖片可能存在網(wǎng)址打不開(kāi)的情況,所以加了10秒超時(shí)控制。
4.圖片保存
建立好一個(gè)images目錄,把圖片都放進(jìn)去,命名的時(shí)侯,以數字命名。
python如何實(shí)現圖片手動(dòng)下載??jì)H須要進(jìn)行四步,即可編撰好python爬蟲(chóng)并實(shí)現圖片手動(dòng)下載。學(xué)習爬蟲(chóng)簡(jiǎn)單吧,即使是菜鳥(niǎo),也能特別快的上手呢。
能夠成功實(shí)現手動(dòng)下載也千萬(wàn)不大意,說(shuō)不定就遇上了反爬蟲(chóng)機制,記得使用IP池突破限制,比如使用黑洞代理。 查看全部
用Python爬蟲(chóng)實(shí)現圖片手動(dòng)下載的方式
爬蟲(chóng)的出現,可以乘以許多重復性的工作,在須要大量采集數據時(shí),爬蟲(chóng)可以實(shí)現手動(dòng)下載,極大的提升了工作效率。那么python如何實(shí)現圖片手動(dòng)下載的呢?如何借助python寫(xiě)爬蟲(chóng)?本文為你們介紹了用Python爬蟲(chóng)實(shí)現圖片手動(dòng)下載的方式。
1.分析需求
比如上百度找圖片,可以通過(guò)搜索功能,查找圖片后,選中其中一個(gè)查看源代碼,找到圖片對應的源代碼,如果圖片多地址,比如有thumbURL,middleURL,hoverURL,objURL,分別打開(kāi)看那個(gè)圖片符合需求。如果objURL符合需求,格式為.jpg。
2.選擇python庫
選擇2個(gè)包,一個(gè)是正則,一個(gè)是requests包。
3.編寫(xiě)代碼
復制百度圖片搜索的鏈接,傳入requests,然后把正則表達式寫(xiě)好。
因為有很多張圖片,所以要循環(huán),我們復印出結果來(lái)瞧瞧,然后用requests獲取網(wǎng)址,由于有些圖片可能存在網(wǎng)址打不開(kāi)的情況,所以加了10秒超時(shí)控制。

4.圖片保存
建立好一個(gè)images目錄,把圖片都放進(jìn)去,命名的時(shí)侯,以數字命名。


python如何實(shí)現圖片手動(dòng)下載??jì)H須要進(jìn)行四步,即可編撰好python爬蟲(chóng)并實(shí)現圖片手動(dòng)下載。學(xué)習爬蟲(chóng)簡(jiǎn)單吧,即使是菜鳥(niǎo),也能特別快的上手呢。
能夠成功實(shí)現手動(dòng)下載也千萬(wàn)不大意,說(shuō)不定就遇上了反爬蟲(chóng)機制,記得使用IP池突破限制,比如使用黑洞代理。
詳解基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 390 次瀏覽 ? 2020-08-21 05:06
詳解基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰
更新時(shí)間:2020年08月20日 10:31:19 轉載投稿:zx
這篇文章主要介紹了解讀基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰,文中通過(guò)示例代碼介紹的十分詳盡,對你們的學(xué)習或則工作具有一定的參考學(xué)習價(jià)值,需要的朋友們下邊隨著(zhù)小編來(lái)一起學(xué)習學(xué)習吧
1.Appium
Appium是一個(gè)開(kāi)源測試自動(dòng)化框架,可用于原生,混合和聯(lián)通Web應用程序測試, 它使用WebDriver合同驅動(dòng)iOS,Android和Windows應用程序。
通過(guò)Appium,我們可以模擬點(diǎn)擊和屏幕的滑動(dòng),可以獲取元素的id和classname,還可以依照操作生成相關(guān)的腳本代碼。
下面開(kāi)始Appium的配置。
appPackage和APPActivity的獲取
任意下載一個(gè)app
解壓
但是解壓下來(lái)的xml文件可能是亂碼,所以我們須要反編譯文件。
逆向AndroidManifest.xml
下載AXMLPrinter2.jar文件,逆向xml文件:命令行輸入以下命令:
java -jar AXMLPrinter2.jar AndroidManifest.xml ->AndroidManifest.txt
獲得以下可以查看的TXT文件
尋找帶有launcher 的Activity
尋找manifest上面的package
Devicename的獲取
通過(guò)命令行輸入 adb devices:
appium的功能介紹
下面將按照上圖序號一一介紹功能:
選中界面元素,顯示元素相關(guān)信息
模擬滑動(dòng)屏幕,先點(diǎn)擊一下代表觸摸起始位置,在點(diǎn)擊一下代表觸摸結束為止
模擬點(diǎn)擊屏幕
模擬手機的返回按鍵
刷新一側的頁(yè)面,使之與手機同步
記錄模擬操作,生成相關(guān)腳本
根據元素的id或則其他相關(guān)信息查找元素
復制當前界面的xml布局
文件退出
2.Python的腳本
元素定位的使用
(1).xpath定位
xpath定位是一種路徑定位方法,主要是依賴(lài)于元素絕對路徑或則相關(guān)屬性來(lái)定位,但是絕對路徑xpath執行效率比較低(特別是元素路徑比較深的時(shí)侯),一般使用比較少。
通常使用xpath相對路徑和屬性定位。
by_xpath.py
from find_element.capability import driver
driver.find_element_by_xpath('//android.widget.EditText[@text="請輸入用戶(hù)名"]').send_keys('123456')
driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="3"]').send_keys('123456')
driver.find_element_by_xpath('//android.widget.Button').click()
driver.find_element_by_xpath('//[@class="android.widget.Button"]').click()
(2).classname定位
classname定位是依據元素類(lèi)型來(lái)進(jìn)行定位,但是實(shí)際情況中好多元素的classname都是相同的,
如用戶(hù)名和密碼都是clasName屬性值都是:“android.widget.EditText” 因此只能定位第一個(gè)元素也就是用戶(hù)名,而密碼輸入框就須要使用其他方法來(lái)定位,這樣也許太雞肋.一般情況下假如有id就毋須使用classname定位。
by_classname.py
from find_element.capability import driver
driver.find_element_by_class_name('android.widget.EditText').send_keys('123565')
driver.find_element_by_class_name('android.widget.EditText').send_keys('456879')
driver.find_element_by_class_name('android.widget.Button').click()
(3).id定位
日常生活中身邊可能存在相同名子的人,但是每位人的身份證號碼是惟一的,在app界面元素中也可以使用id值來(lái)分辨不同的元素,然后進(jìn)行定位操作。
Appium中可以使用 find_element_by_id() 方法來(lái)進(jìn)行id定位。
driver.find_element_by_id('android:id/button2').click()
driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
3.示例:模擬軟件的手動(dòng)注冊
首先配置聯(lián)接屬性
desired_caps={}
# 所使用的平臺
desired_caps['platformName']='Android'
# 所使用的手機的名字 可以通過(guò) adb devices 獲得
desired_caps['deviceName']='127.0.0.1:62001'
# ANDROID 的版本
desired_caps['platforVersion']='5.1.1'
# app 的路徑
desired_caps['app']=r'D:\extend\kaoyanbang.apk'
# app的包名
desired_caps['appPackage']='com.tal.kaoyan'
# app 加載頁(yè)面
desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
# 設置每次是否清除數據
desired_caps['noReset']='False'
# 是否使用unicode鍵盤(pán)輸入,在輸入中文字符和unicode字符時(shí)設置為true
desired_caps['unicodeKeyboard']="True"
# 是否將鍵盤(pán)重置為初始狀態(tài),設置了unicodeKeyboard時(shí),在測試完成后,設置為true,將鍵盤(pán)重置
desired_caps['resetKeyboard']="True"
# appium服務(wù)器的連接地址
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(2)
編寫(xiě)操作腳本
import random
import time
driver.find_element_by_id('com.tal.kaoyan:id/login_register_text').click()
username='zx2019'+'F2LY'+str(random.randint(1000,9000))
print('username: %s' %username)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_username_edittext').send_keys(username)
password='zxw2018'+str(random.randint(1000,9000))
print('password: %s' %password)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_password_edittext').send_keys(password)
email='51zxw'+str(random.randint(1000,9000))+'@163.com'
print('email: %s' %email)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_email_edittext').send_keys(email)
#點(diǎn)擊進(jìn)入考研幫
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_register_btn').click()
#專(zhuān)業(yè)選擇
driver.find_element_by_id('com.tal.kaoyan:id/activity_perfectinfomation_major').click()
driver.find_elements_by_id('com.tal.kaoyan:id/major_subject_title')[1].click()
driver.find_elements_by_id('com.tal.kaoyan:id/major_group_title')[2].click()
driver.find_elements_by_id('com.tal.kaoyan:id/major_search_item_name')[1].click()
#院校選擇
driver.find_element_by_id('com.tal.kaoyan:id/activity_perfectinfomation_school').click()
driver.tap([(182,1557),])
driver.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/android.widget.'
'RelativeLayout/android.widget.ExpandableListView/android.widget.'
'LinearLayout[1]/android.widget.TextView[1]').click()
driver.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/'
'android.widget.RelativeLayout/android.widget.ExpandableListView/'
'android.widget.LinearLayout[4]/android.widget.TextView').click()
time.sleep(2)
driver.tap([(983,1354),])
# driver.find_elements_by_id('com.tal.kaoyan:id/more_forum_title')[1].click()
# driver.find_elements_by_id('com.tal.kaoyan:id/university_search_item_name')[1].click()
driver.find_element_by_id('com.tal.kaoyan:id/activity_perfectinfomation_goBtn').click()
print('注冊成功')
到此這篇關(guān)于解讀基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰的文章就介紹到這了,更多相關(guān)Android的Appium+Python自動(dòng)化腳本內容請搜索腳本之家先前的文章或繼續瀏覽下邊的相關(guān)文章希望你們之后多多支持腳本之家! 查看全部
詳解基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰
詳解基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰
更新時(shí)間:2020年08月20日 10:31:19 轉載投稿:zx
這篇文章主要介紹了解讀基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰,文中通過(guò)示例代碼介紹的十分詳盡,對你們的學(xué)習或則工作具有一定的參考學(xué)習價(jià)值,需要的朋友們下邊隨著(zhù)小編來(lái)一起學(xué)習學(xué)習吧
1.Appium
Appium是一個(gè)開(kāi)源測試自動(dòng)化框架,可用于原生,混合和聯(lián)通Web應用程序測試, 它使用WebDriver合同驅動(dòng)iOS,Android和Windows應用程序。
通過(guò)Appium,我們可以模擬點(diǎn)擊和屏幕的滑動(dòng),可以獲取元素的id和classname,還可以依照操作生成相關(guān)的腳本代碼。
下面開(kāi)始Appium的配置。

appPackage和APPActivity的獲取
任意下載一個(gè)app
解壓

但是解壓下來(lái)的xml文件可能是亂碼,所以我們須要反編譯文件。
逆向AndroidManifest.xml
下載AXMLPrinter2.jar文件,逆向xml文件:命令行輸入以下命令:
java -jar AXMLPrinter2.jar AndroidManifest.xml ->AndroidManifest.txt
獲得以下可以查看的TXT文件

尋找帶有launcher 的Activity

尋找manifest上面的package

Devicename的獲取
通過(guò)命令行輸入 adb devices:

appium的功能介紹


下面將按照上圖序號一一介紹功能:
選中界面元素,顯示元素相關(guān)信息

模擬滑動(dòng)屏幕,先點(diǎn)擊一下代表觸摸起始位置,在點(diǎn)擊一下代表觸摸結束為止
模擬點(diǎn)擊屏幕
模擬手機的返回按鍵
刷新一側的頁(yè)面,使之與手機同步
記錄模擬操作,生成相關(guān)腳本

根據元素的id或則其他相關(guān)信息查找元素

復制當前界面的xml布局
文件退出
2.Python的腳本
元素定位的使用
(1).xpath定位
xpath定位是一種路徑定位方法,主要是依賴(lài)于元素絕對路徑或則相關(guān)屬性來(lái)定位,但是絕對路徑xpath執行效率比較低(特別是元素路徑比較深的時(shí)侯),一般使用比較少。
通常使用xpath相對路徑和屬性定位。
by_xpath.py
from find_element.capability import driver
driver.find_element_by_xpath('//android.widget.EditText[@text="請輸入用戶(hù)名"]').send_keys('123456')
driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="3"]').send_keys('123456')
driver.find_element_by_xpath('//android.widget.Button').click()
driver.find_element_by_xpath('//[@class="android.widget.Button"]').click()
(2).classname定位
classname定位是依據元素類(lèi)型來(lái)進(jìn)行定位,但是實(shí)際情況中好多元素的classname都是相同的,
如用戶(hù)名和密碼都是clasName屬性值都是:“android.widget.EditText” 因此只能定位第一個(gè)元素也就是用戶(hù)名,而密碼輸入框就須要使用其他方法來(lái)定位,這樣也許太雞肋.一般情況下假如有id就毋須使用classname定位。
by_classname.py
from find_element.capability import driver
driver.find_element_by_class_name('android.widget.EditText').send_keys('123565')
driver.find_element_by_class_name('android.widget.EditText').send_keys('456879')
driver.find_element_by_class_name('android.widget.Button').click()
(3).id定位
日常生活中身邊可能存在相同名子的人,但是每位人的身份證號碼是惟一的,在app界面元素中也可以使用id值來(lái)分辨不同的元素,然后進(jìn)行定位操作。
Appium中可以使用 find_element_by_id() 方法來(lái)進(jìn)行id定位。
driver.find_element_by_id('android:id/button2').click()
driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
3.示例:模擬軟件的手動(dòng)注冊
首先配置聯(lián)接屬性
desired_caps={}
# 所使用的平臺
desired_caps['platformName']='Android'
# 所使用的手機的名字 可以通過(guò) adb devices 獲得
desired_caps['deviceName']='127.0.0.1:62001'
# ANDROID 的版本
desired_caps['platforVersion']='5.1.1'
# app 的路徑
desired_caps['app']=r'D:\extend\kaoyanbang.apk'
# app的包名
desired_caps['appPackage']='com.tal.kaoyan'
# app 加載頁(yè)面
desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
# 設置每次是否清除數據
desired_caps['noReset']='False'
# 是否使用unicode鍵盤(pán)輸入,在輸入中文字符和unicode字符時(shí)設置為true
desired_caps['unicodeKeyboard']="True"
# 是否將鍵盤(pán)重置為初始狀態(tài),設置了unicodeKeyboard時(shí),在測試完成后,設置為true,將鍵盤(pán)重置
desired_caps['resetKeyboard']="True"
# appium服務(wù)器的連接地址
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(2)
編寫(xiě)操作腳本
import random
import time
driver.find_element_by_id('com.tal.kaoyan:id/login_register_text').click()
username='zx2019'+'F2LY'+str(random.randint(1000,9000))
print('username: %s' %username)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_username_edittext').send_keys(username)
password='zxw2018'+str(random.randint(1000,9000))
print('password: %s' %password)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_password_edittext').send_keys(password)
email='51zxw'+str(random.randint(1000,9000))+'@163.com'
print('email: %s' %email)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_email_edittext').send_keys(email)
#點(diǎn)擊進(jìn)入考研幫
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_register_btn').click()
#專(zhuān)業(yè)選擇
driver.find_element_by_id('com.tal.kaoyan:id/activity_perfectinfomation_major').click()
driver.find_elements_by_id('com.tal.kaoyan:id/major_subject_title')[1].click()
driver.find_elements_by_id('com.tal.kaoyan:id/major_group_title')[2].click()
driver.find_elements_by_id('com.tal.kaoyan:id/major_search_item_name')[1].click()
#院校選擇
driver.find_element_by_id('com.tal.kaoyan:id/activity_perfectinfomation_school').click()
driver.tap([(182,1557),])
driver.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/android.widget.'
'RelativeLayout/android.widget.ExpandableListView/android.widget.'
'LinearLayout[1]/android.widget.TextView[1]').click()
driver.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/'
'android.widget.RelativeLayout/android.widget.ExpandableListView/'
'android.widget.LinearLayout[4]/android.widget.TextView').click()
time.sleep(2)
driver.tap([(983,1354),])
# driver.find_elements_by_id('com.tal.kaoyan:id/more_forum_title')[1].click()
# driver.find_elements_by_id('com.tal.kaoyan:id/university_search_item_name')[1].click()
driver.find_element_by_id('com.tal.kaoyan:id/activity_perfectinfomation_goBtn').click()
print('注冊成功')
到此這篇關(guān)于解讀基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰的文章就介紹到這了,更多相關(guān)Android的Appium+Python自動(dòng)化腳本內容請搜索腳本之家先前的文章或繼續瀏覽下邊的相關(guān)文章希望你們之后多多支持腳本之家!
使用Shell編撰定時(shí)向指定API獲取數據的腳本
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 220 次瀏覽 ? 2020-08-20 18:32
場(chǎng)景:這個(gè)在服務(wù)器上寫(xiě)定時(shí)腳本的情況十分多,比如每晚向定時(shí)往用戶(hù)推送相關(guān)信息,定時(shí)清除相關(guān)數據,定時(shí)短信提醒等等。
本文的場(chǎng)景是采用shell定時(shí)向指定開(kāi)放API獲取數據。
本文使用的是crontab,可以先在終端查看是開(kāi)啟此服務(wù),命令如下:
yang@master:~$ sudo service cron status
[sudo] password for yang:
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: ena
Active: active (running) since Sat 2016-08-13 08:29:16 CST; 30min ago
Docs: man:cron(8)
Main PID: 831 (cron)
CGroup: /system.slice/cron.service
└─831 /usr/sbin/cron -f
Aug 13 08:29:16 master systemd[1]: Started Regular background program processing
Aug 13 08:29:16 master cron[831]: (CRON) INFO (pidfile fd = 3)
Aug 13 08:29:16 master cron[831]: (CRON) INFO (Running @reboot jobs)
編寫(xiě)定時(shí)腳本
這個(gè)腳本是我們要定時(shí)器定時(shí)執行的任務(wù),即我們要定時(shí)做什么,在這里,我是要使腳本手動(dòng)采集數據,腳本如下:
#!/usr/bin/env bash
path_log="fetch_data.log"
path_stuTenSch="http://www.google.com"
code_success="200"
#get http response code
http_code=$(curl -s -o /dev/null -I -w "%{http_code}" $path_stuTenSch)
#echo "$http_code" >> $path_log
if [ "$http_code"==$code_success ]; then
echo "Status Code:$http_code, success, Resquest URL: $path_stuTenSch" >> $path_log
echo "starting..........." >> $path_log
curl $path_stuTenSch > /home/hadoop/tmp_data/users.json
echo "end----------------" >> $path_log
else
echo "Status Code:$http_code, fail, Resquest URL: $path_stuTenSch" >> $path_log
fi
編輯crontab
編輯crontab是用crontab -e執行,crontab -l來(lái)顯示有什么定時(shí)器。每個(gè)定時(shí)器用一行來(lái)表示。通常情況下,有6個(gè)參數,分別為分鐘,小時(shí),天,月,周,要執行的命令,*表示任意時(shí)間,/n表示每隔n的時(shí)間進(jìn)行重復。
yang@master:~$ crontab -e
*/1 * * * * /home/yang/shell/fetch_data.sh
在這里,我是每隔一分鐘執行一次sh腳本。 查看全部
使用Shell編撰定時(shí)向指定API獲取數據的腳本
場(chǎng)景:這個(gè)在服務(wù)器上寫(xiě)定時(shí)腳本的情況十分多,比如每晚向定時(shí)往用戶(hù)推送相關(guān)信息,定時(shí)清除相關(guān)數據,定時(shí)短信提醒等等。
本文的場(chǎng)景是采用shell定時(shí)向指定開(kāi)放API獲取數據。
本文使用的是crontab,可以先在終端查看是開(kāi)啟此服務(wù),命令如下:
yang@master:~$ sudo service cron status
[sudo] password for yang:
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: ena
Active: active (running) since Sat 2016-08-13 08:29:16 CST; 30min ago
Docs: man:cron(8)
Main PID: 831 (cron)
CGroup: /system.slice/cron.service
└─831 /usr/sbin/cron -f
Aug 13 08:29:16 master systemd[1]: Started Regular background program processing
Aug 13 08:29:16 master cron[831]: (CRON) INFO (pidfile fd = 3)
Aug 13 08:29:16 master cron[831]: (CRON) INFO (Running @reboot jobs)
編寫(xiě)定時(shí)腳本
這個(gè)腳本是我們要定時(shí)器定時(shí)執行的任務(wù),即我們要定時(shí)做什么,在這里,我是要使腳本手動(dòng)采集數據,腳本如下:
#!/usr/bin/env bash
path_log="fetch_data.log"
path_stuTenSch="http://www.google.com"
code_success="200"
#get http response code
http_code=$(curl -s -o /dev/null -I -w "%{http_code}" $path_stuTenSch)
#echo "$http_code" >> $path_log
if [ "$http_code"==$code_success ]; then
echo "Status Code:$http_code, success, Resquest URL: $path_stuTenSch" >> $path_log
echo "starting..........." >> $path_log
curl $path_stuTenSch > /home/hadoop/tmp_data/users.json
echo "end----------------" >> $path_log
else
echo "Status Code:$http_code, fail, Resquest URL: $path_stuTenSch" >> $path_log
fi
編輯crontab
編輯crontab是用crontab -e執行,crontab -l來(lái)顯示有什么定時(shí)器。每個(gè)定時(shí)器用一行來(lái)表示。通常情況下,有6個(gè)參數,分別為分鐘,小時(shí),天,月,周,要執行的命令,*表示任意時(shí)間,/n表示每隔n的時(shí)間進(jìn)行重復。
yang@master:~$ crontab -e
*/1 * * * * /home/yang/shell/fetch_data.sh
在這里,我是每隔一分鐘執行一次sh腳本。
自己編撰網(wǎng)站防采集程序
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 327 次瀏覽 ? 2020-08-20 18:15
對于我們這些數據量很大的網(wǎng)站,面臨的一個(gè)麻煩是總有人來(lái)采集,以前多使用過(guò)人工檢測、屏蔽的辦法,這種辦法有療效但很費精力,前段時(shí)間也找了插件來(lái)自動(dòng)限制最大連接數,但存在誤屏蔽搜索引擎的問(wèn)題,最近老朽下決定親自操刀寫(xiě)程序,把那些采集器都斬草除根,雖然編程麻煩但效果好。
思路是在Drupal的模板文件中嵌入PHP程序代碼,讀取$_SERVER參數并記錄到數據庫中,通過(guò)對參數及訪(fǎng)問(wèn)頻度的判定來(lái)決定是否要訪(fǎng)問(wèn)者遞交驗證碼,如果驗證碼錯誤或則不填寫(xiě)的次數過(guò)多則屏蔽,可以通過(guò)host反向dns查找來(lái)判斷常見(jiàn)搜索引擎。
這個(gè)程序還稍稍有點(diǎn)復雜,以前更改開(kāi)源PHP程序都是直接上手,這個(gè)程序還編撰了流程圖,數據庫表結構也是自己規劃的,為了防止拉慢速率,MySQL中采用了Memory引擎,對于多是臨時(shí)訪(fǎng)問(wèn)記錄早已夠用了。程序寫(xiě)得太爛,就不放到博客中了。
這個(gè)程序anti-scraping.php上周調試了幾天,本周剛才投入試用,已經(jīng)可以從日志中見(jiàn)到療效,還須要不斷改進(jìn),例如降低黑名單、白名單、嘗試改用Drupal標準第三方模塊的形式等。因為完成采用自己編程實(shí)現,所以可以對判斷標準、屏蔽方法做各類(lèi)更改嘗試,應對各類(lèi)采集器。
版本歷史:
To Do List: 查看全部
自己編撰網(wǎng)站防采集程序
對于我們這些數據量很大的網(wǎng)站,面臨的一個(gè)麻煩是總有人來(lái)采集,以前多使用過(guò)人工檢測、屏蔽的辦法,這種辦法有療效但很費精力,前段時(shí)間也找了插件來(lái)自動(dòng)限制最大連接數,但存在誤屏蔽搜索引擎的問(wèn)題,最近老朽下決定親自操刀寫(xiě)程序,把那些采集器都斬草除根,雖然編程麻煩但效果好。
思路是在Drupal的模板文件中嵌入PHP程序代碼,讀取$_SERVER參數并記錄到數據庫中,通過(guò)對參數及訪(fǎng)問(wèn)頻度的判定來(lái)決定是否要訪(fǎng)問(wèn)者遞交驗證碼,如果驗證碼錯誤或則不填寫(xiě)的次數過(guò)多則屏蔽,可以通過(guò)host反向dns查找來(lái)判斷常見(jiàn)搜索引擎。
這個(gè)程序還稍稍有點(diǎn)復雜,以前更改開(kāi)源PHP程序都是直接上手,這個(gè)程序還編撰了流程圖,數據庫表結構也是自己規劃的,為了防止拉慢速率,MySQL中采用了Memory引擎,對于多是臨時(shí)訪(fǎng)問(wèn)記錄早已夠用了。程序寫(xiě)得太爛,就不放到博客中了。
這個(gè)程序anti-scraping.php上周調試了幾天,本周剛才投入試用,已經(jīng)可以從日志中見(jiàn)到療效,還須要不斷改進(jìn),例如降低黑名單、白名單、嘗試改用Drupal標準第三方模塊的形式等。因為完成采用自己編程實(shí)現,所以可以對判斷標準、屏蔽方法做各類(lèi)更改嘗試,應對各類(lèi)采集器。
版本歷史:
To Do List:
自動(dòng)采集編寫(xiě) 聊一聊爬蟲(chóng)那點(diǎn)事兒(一)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 492 次瀏覽 ? 2020-08-20 02:08
爬蟲(chóng)學(xué)習入門(mén)篇
作為一名程序員,大家對于爬蟲(chóng)這個(gè)詞的理解都有不同,我曾經(jīng)的理解就是一只spider在網(wǎng)路上爬取東西,不過(guò)我們能控制這只spider去爬取須要內容并存取到數據庫中。后來(lái)才發(fā)覺(jué)爬蟲(chóng)有點(diǎn)重要?。?!
網(wǎng)絡(luò )爬蟲(chóng)的介紹
在大數據時(shí)代,信息的采集是一項重要的工作,而互聯(lián)網(wǎng)中的數據是海量的,如果單純靠人力進(jìn)行信息采集,不僅低效繁雜,搜集的成本也會(huì )增強。如何手動(dòng)高效地獲取互聯(lián)網(wǎng)中我們感興趣的信息并為我們所用是一個(gè)重要的問(wèn)題,而爬蟲(chóng)技術(shù)就是為了解決這種問(wèn)題而生的。
網(wǎng)絡(luò )爬蟲(chóng)(Web crawler)也稱(chēng)作網(wǎng)路機器人,可以取代人們手動(dòng)地在互聯(lián)網(wǎng)中進(jìn)行數據信息的采集與整理。它是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本,可以手動(dòng)采集所有其才能訪(fǎng)問(wèn)到的頁(yè)面內容,以獲取相關(guān)數據。
從功能上來(lái)講,爬蟲(chóng)通常分為數據采集,處理,儲存三個(gè)部份。爬蟲(chóng)從一個(gè)或若干初始網(wǎng)頁(yè)的URL開(kāi)始,獲得初始網(wǎng)頁(yè)上的URL,在抓取網(wǎng)頁(yè)的過(guò)程中,不斷從當前頁(yè)面上抽取新的URL裝入隊列,直到滿(mǎn)足系統的一定停止條件。
為什么要學(xué)爬蟲(chóng)可以實(shí)現搜索引擎。我們學(xué)會(huì )了爬蟲(chóng)編撰以后,就可以借助爬蟲(chóng)手動(dòng)地采集互聯(lián)網(wǎng)中的信息,采集回來(lái)后進(jìn)行相應的儲存或處理,在須要檢索個(gè)別信息的時(shí)侯,只需在采集回來(lái)的信息中進(jìn)行檢索,即實(shí)現了私人的搜索引擎。大數據時(shí)代,可以使我們獲取更多的數據源。在進(jìn)行大數據剖析或則進(jìn)行數據挖掘的時(shí)侯,需要有數據源進(jìn)行剖析。我們可以從個(gè)別提供數據統計的網(wǎng)站獲得,也可以從個(gè)別文獻或內部資料中獲得,但是這種獲得數據的方法,有時(shí)很難滿(mǎn)足我們對數據的需求,而自動(dòng)從互聯(lián)網(wǎng)中去找尋那些數據,則花費的精力過(guò)大。此時(shí)就可以借助爬蟲(chóng)技術(shù),自動(dòng)地從互聯(lián)網(wǎng)中獲取我們感興趣的數據內容,并將這種數據內容爬取回去,作為我們的數據源,再進(jìn)行更深層次的數據剖析,并獲得更多有價(jià)值的信息??梢愿玫剡M(jìn)行搜索引擎優(yōu)化(SEO)。對于好多SEO從業(yè)者來(lái)說(shuō),為了更好的完成工作,那么就必須要對搜索引擎的工作原理十分清楚,同時(shí)也須要把握搜索引擎爬蟲(chóng)的工作原理。而學(xué)習爬蟲(chóng),可以更深層次地理解搜索引擎爬蟲(chóng)的工作原理,這樣在進(jìn)行搜索引擎優(yōu)化時(shí),才能知己知彼,百戰不殆。有利于就業(yè)。從就業(yè)來(lái)說(shuō),爬蟲(chóng)工程師方向是不錯的選擇之一,因為目前爬蟲(chóng)工程師的需求越來(lái)越大,而能否勝任這方面崗位的人員較少,所以屬于一個(gè)比較短缺的職業(yè)方向,并且隨著(zhù)大數據時(shí)代和人工智能的將至,爬蟲(chóng)技術(shù)的應用將越來(lái)越廣泛,在未來(lái)會(huì )擁有挺好的發(fā)展空間。
爬蟲(chóng)入門(mén)程序1.環(huán)境打算
編譯環(huán)境打算:
l JDK1.8l IntelliJ IDEAlIDEA自帶的Maven
IDEA操作步驟:
1.創(chuàng )建Maven工程itcast-crawler-first并給pom.xml加入依賴(lài)
org.apache.httpcomponents
httpclient
4.5.3
org.slf4j
slf4j-log4j12
1.7.25
2.加入log4j.properties
log4j.rootLogger=DEBUG,A1
log4j.logger.cn.itcast = DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
2.編寫(xiě)代碼 查看全部
自動(dòng)采集編寫(xiě) 聊一聊爬蟲(chóng)那點(diǎn)事兒(一)
爬蟲(chóng)學(xué)習入門(mén)篇

作為一名程序員,大家對于爬蟲(chóng)這個(gè)詞的理解都有不同,我曾經(jīng)的理解就是一只spider在網(wǎng)路上爬取東西,不過(guò)我們能控制這只spider去爬取須要內容并存取到數據庫中。后來(lái)才發(fā)覺(jué)爬蟲(chóng)有點(diǎn)重要?。?!
網(wǎng)絡(luò )爬蟲(chóng)的介紹
在大數據時(shí)代,信息的采集是一項重要的工作,而互聯(lián)網(wǎng)中的數據是海量的,如果單純靠人力進(jìn)行信息采集,不僅低效繁雜,搜集的成本也會(huì )增強。如何手動(dòng)高效地獲取互聯(lián)網(wǎng)中我們感興趣的信息并為我們所用是一個(gè)重要的問(wèn)題,而爬蟲(chóng)技術(shù)就是為了解決這種問(wèn)題而生的。
網(wǎng)絡(luò )爬蟲(chóng)(Web crawler)也稱(chēng)作網(wǎng)路機器人,可以取代人們手動(dòng)地在互聯(lián)網(wǎng)中進(jìn)行數據信息的采集與整理。它是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本,可以手動(dòng)采集所有其才能訪(fǎng)問(wèn)到的頁(yè)面內容,以獲取相關(guān)數據。
從功能上來(lái)講,爬蟲(chóng)通常分為數據采集,處理,儲存三個(gè)部份。爬蟲(chóng)從一個(gè)或若干初始網(wǎng)頁(yè)的URL開(kāi)始,獲得初始網(wǎng)頁(yè)上的URL,在抓取網(wǎng)頁(yè)的過(guò)程中,不斷從當前頁(yè)面上抽取新的URL裝入隊列,直到滿(mǎn)足系統的一定停止條件。
為什么要學(xué)爬蟲(chóng)可以實(shí)現搜索引擎。我們學(xué)會(huì )了爬蟲(chóng)編撰以后,就可以借助爬蟲(chóng)手動(dòng)地采集互聯(lián)網(wǎng)中的信息,采集回來(lái)后進(jìn)行相應的儲存或處理,在須要檢索個(gè)別信息的時(shí)侯,只需在采集回來(lái)的信息中進(jìn)行檢索,即實(shí)現了私人的搜索引擎。大數據時(shí)代,可以使我們獲取更多的數據源。在進(jìn)行大數據剖析或則進(jìn)行數據挖掘的時(shí)侯,需要有數據源進(jìn)行剖析。我們可以從個(gè)別提供數據統計的網(wǎng)站獲得,也可以從個(gè)別文獻或內部資料中獲得,但是這種獲得數據的方法,有時(shí)很難滿(mǎn)足我們對數據的需求,而自動(dòng)從互聯(lián)網(wǎng)中去找尋那些數據,則花費的精力過(guò)大。此時(shí)就可以借助爬蟲(chóng)技術(shù),自動(dòng)地從互聯(lián)網(wǎng)中獲取我們感興趣的數據內容,并將這種數據內容爬取回去,作為我們的數據源,再進(jìn)行更深層次的數據剖析,并獲得更多有價(jià)值的信息??梢愿玫剡M(jìn)行搜索引擎優(yōu)化(SEO)。對于好多SEO從業(yè)者來(lái)說(shuō),為了更好的完成工作,那么就必須要對搜索引擎的工作原理十分清楚,同時(shí)也須要把握搜索引擎爬蟲(chóng)的工作原理。而學(xué)習爬蟲(chóng),可以更深層次地理解搜索引擎爬蟲(chóng)的工作原理,這樣在進(jìn)行搜索引擎優(yōu)化時(shí),才能知己知彼,百戰不殆。有利于就業(yè)。從就業(yè)來(lái)說(shuō),爬蟲(chóng)工程師方向是不錯的選擇之一,因為目前爬蟲(chóng)工程師的需求越來(lái)越大,而能否勝任這方面崗位的人員較少,所以屬于一個(gè)比較短缺的職業(yè)方向,并且隨著(zhù)大數據時(shí)代和人工智能的將至,爬蟲(chóng)技術(shù)的應用將越來(lái)越廣泛,在未來(lái)會(huì )擁有挺好的發(fā)展空間。

爬蟲(chóng)入門(mén)程序1.環(huán)境打算
編譯環(huán)境打算:
l JDK1.8l IntelliJ IDEAlIDEA自帶的Maven
IDEA操作步驟:
1.創(chuàng )建Maven工程itcast-crawler-first并給pom.xml加入依賴(lài)

org.apache.httpcomponents
httpclient
4.5.3
org.slf4j
slf4j-log4j12
1.7.25
2.加入log4j.properties
log4j.rootLogger=DEBUG,A1
log4j.logger.cn.itcast = DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
2.編寫(xiě)代碼
自動(dòng)采集編寫(xiě) scrapy爬取新浪微博分享(2)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 393 次瀏覽 ? 2020-08-18 23:34
內容概要:
最近自己學(xué)習了一些爬蟲(chóng),學(xué)習之余,寫(xiě)了一個(gè)新浪微博的爬蟲(chóng)。大規模爬數據沒(méi)有試過(guò),但是爬取幾十萬(wàn)應當沒(méi)有哪些問(wèn)題。爬蟲(chóng)爬取的站點(diǎn)是新浪移動(dòng)端站點(diǎn)。github地址為:
第一次寫(xiě)文章,難免有疏漏,大家共同交流,共同進(jìn)步。也請喜歡的同學(xué),在github上打個(gè)star
內容分為三章,第一張介紹scrapy,第二張剖析爬取網(wǎng)站,第三章剖析代碼。
Fiddler工具
Fiddler是坐落客戶(hù)端和服務(wù)器端的HTTP代理,也是目前最常用的http抓包工具之一。它才能記錄客戶(hù)端和服務(wù)器之間的所有HTTP請求,可以針對特定的HTTP請求,分析懇求數據、設置斷點(diǎn)、調試Web應用、請求更改數據、甚至可以更改服務(wù)器返回的數據,功能十分強悍,是WEB調試的神器。
既然是代理,也就是說(shuō):客戶(hù)端的所有懇求都要先經(jīng)過(guò)Fiddler,然后轉發(fā)到相應的服務(wù)器,反之,服務(wù)器端的所有相應,也就會(huì )先經(jīng)過(guò)Fiddler之后發(fā)送到客戶(hù)端。
分析新浪微博數據結構
首先我們登陸微博可以看見(jiàn)Fiddler抓取的包:
其中點(diǎn)擊 /api/container/getIndex?type=uid&value=6311254871&containerid=54871 HTTP/1.1我們可以看見(jiàn)微博獲取個(gè)人信息的API接口,里面儲存著(zhù)json數據。
簡(jiǎn)單剖析下JSON,我們可以曉得上面儲存著(zhù)愛(ài)稱(chēng)、個(gè)性簽名、微博數、關(guān)注數、粉絲數等個(gè)人信息。我們可以記錄下我們須要的信息。
同理,我們通過(guò)不斷剖析Fiddler抓取的包可以得到微博內容的API,粉絲列表的API,關(guān)注者列表的API。里面依然是JSON格式,我們從中記錄下我們須要的信息。
編寫(xiě)Model層
剛剛我們記錄下了各個(gè)API中我們須要抓取的信息,然后就可以在程序中編撰我們的數據層了。scrapy是用Django編撰的,他們的數據層基本是一樣的,是由Django的ARM框架封裝的。
類(lèi)似于右圖,我們把帶抓取的數據格式寫(xiě)好:
把數據庫配置好:
完成以上步驟就可以打算編撰我們的爬蟲(chóng)代碼了。
參考:
1、《Python網(wǎng)路數據采集》
2、 查看全部
自動(dòng)采集編寫(xiě) scrapy爬取新浪微博分享(2)
內容概要:
最近自己學(xué)習了一些爬蟲(chóng),學(xué)習之余,寫(xiě)了一個(gè)新浪微博的爬蟲(chóng)。大規模爬數據沒(méi)有試過(guò),但是爬取幾十萬(wàn)應當沒(méi)有哪些問(wèn)題。爬蟲(chóng)爬取的站點(diǎn)是新浪移動(dòng)端站點(diǎn)。github地址為:
第一次寫(xiě)文章,難免有疏漏,大家共同交流,共同進(jìn)步。也請喜歡的同學(xué),在github上打個(gè)star
內容分為三章,第一張介紹scrapy,第二張剖析爬取網(wǎng)站,第三章剖析代碼。
Fiddler工具
Fiddler是坐落客戶(hù)端和服務(wù)器端的HTTP代理,也是目前最常用的http抓包工具之一。它才能記錄客戶(hù)端和服務(wù)器之間的所有HTTP請求,可以針對特定的HTTP請求,分析懇求數據、設置斷點(diǎn)、調試Web應用、請求更改數據、甚至可以更改服務(wù)器返回的數據,功能十分強悍,是WEB調試的神器。
既然是代理,也就是說(shuō):客戶(hù)端的所有懇求都要先經(jīng)過(guò)Fiddler,然后轉發(fā)到相應的服務(wù)器,反之,服務(wù)器端的所有相應,也就會(huì )先經(jīng)過(guò)Fiddler之后發(fā)送到客戶(hù)端。
分析新浪微博數據結構
首先我們登陸微博可以看見(jiàn)Fiddler抓取的包:

其中點(diǎn)擊 /api/container/getIndex?type=uid&value=6311254871&containerid=54871 HTTP/1.1我們可以看見(jiàn)微博獲取個(gè)人信息的API接口,里面儲存著(zhù)json數據。
簡(jiǎn)單剖析下JSON,我們可以曉得上面儲存著(zhù)愛(ài)稱(chēng)、個(gè)性簽名、微博數、關(guān)注數、粉絲數等個(gè)人信息。我們可以記錄下我們須要的信息。
同理,我們通過(guò)不斷剖析Fiddler抓取的包可以得到微博內容的API,粉絲列表的API,關(guān)注者列表的API。里面依然是JSON格式,我們從中記錄下我們須要的信息。
編寫(xiě)Model層
剛剛我們記錄下了各個(gè)API中我們須要抓取的信息,然后就可以在程序中編撰我們的數據層了。scrapy是用Django編撰的,他們的數據層基本是一樣的,是由Django的ARM框架封裝的。
類(lèi)似于右圖,我們把帶抓取的數據格式寫(xiě)好:

把數據庫配置好:

完成以上步驟就可以打算編撰我們的爬蟲(chóng)代碼了。
參考:
1、《Python網(wǎng)路數據采集》
2、
全手動(dòng)采集版小說(shuō)網(wǎng)站不用管理
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 392 次瀏覽 ? 2020-08-18 16:03
商品屬性
安裝環(huán)境
商品介紹
您能找到這個(gè)小說(shuō)源碼,說(shuō)明您準備用心建一個(gè)小說(shuō)網(wǎng)站,做站最重要的就是穩定更新和程序的不斷升級,你會(huì )選擇仍然不升級的源碼嗎?該小說(shuō)源碼程序,定期更新,請放心使用建站。為什么選擇dedecms做的這個(gè)程序做小說(shuō)網(wǎng),那是因為現今杰奇小說(shuō)程序和模板猖獗,您假如想從幾百萬(wàn)個(gè)一樣的網(wǎng)站中脫引而出這么就選擇這套dedecms開(kāi)發(fā)的源碼來(lái)建設您的網(wǎng)站嗎?大家都曉得國外SEO好友的程序源碼就是這個(gè)dedecms。還在遲疑哪些呢,趕快下手吧,建站和更新內容一樣,越早越好。
全網(wǎng)僅此一家為正版域名授權,如果有其他店面銷(xiāo)售,那肯定是二手或則山寨的了!
近期發(fā)覺(jué)有同行盜賣(mài)本店的程序,并且十分不厚道的說(shuō)是他自己開(kāi)發(fā)的,真是無(wú)語(yǔ)。
全新升級20151107版,支持:
百度主動(dòng)推送
百度站內搜索
后臺采集規則在線(xiàn)更新(目前預留)
多種章節內容儲存方法
微信小說(shuō)公眾號驗證平臺(支持微信公眾號自定義頂部菜單)
支持緩存功能等等,程序更快,負載更大!
重大更新,本程序被百度收錄后,主頁(yè)會(huì )手動(dòng)顯示logo,小說(shuō)目錄會(huì )手動(dòng)小說(shuō)模版適配:
還有好多功能是這些盜賣(mài)的難以提供的。
另外,本程序實(shí)行后臺在線(xiàn)更新后,其他盜賣(mài)的就難以繼續升級了,之前的更新都是直接提供更新包,而這些盜賣(mài)的就直接從群里拿了更新包說(shuō)是自己提供的更新包。 我們故意拖延了半年沒(méi)更新,結果就可想而知了......
我們的后臺還提供了更新歷史,可以查看每次更新了什么功能,并提供了新功能的使用說(shuō)明......
1、源碼類(lèi)型:整站源碼
2-1、環(huán)境要求:PHP5.2/5.3/5.4/5.5+MYSQL5(URLrewrite)
2-2、服務(wù)器要求:建議用40G數據盤(pán)以上的VPS或則獨立服務(wù)器,系統建議用Windows而不建議用Linux,99%的小說(shuō)站服務(wù)器是用Windows系統,方便文件管理以及備份等(目前演示站空間使用情況:6.5G數據庫+5G網(wǎng)頁(yè)空間,經(jīng)群內站友網(wǎng)站證實(shí):4核CPU+4G顯存的xen構架VPS能承受日5萬(wàn)IP、50萬(wàn)PV流量毫無(wú)壓力,每天收入700元以上)
3、原創(chuàng )程序:織夢(mèng)DEDECMS 5.7SP1
4、編碼類(lèi)型:GBK
5、可否采集:全手動(dòng)采集,贈送規則,好評后還可以免費訂制一條
6、演示站點(diǎn): ,自帶手機版:(可提供免費友情鏈接)
7、安裝升級:包安裝、附帶詳盡使用說(shuō)明,免費升級
8、其他特征:
?。?)自動(dòng)生成首頁(yè)、分類(lèi)、目錄、作者、排行榜、sitemap頁(yè)面靜態(tài)html。
?。?)全站拼音目錄化(可自定義URL格式),章節頁(yè)面偽靜態(tài)。
?。?)支持下載功能,可以手動(dòng)生成對應文本文件,可在文件中設置廣告。
?。?)自動(dòng)生成關(guān)鍵詞及關(guān)鍵詞手動(dòng)內鏈。
?。?)自動(dòng)偽原創(chuàng )成語(yǔ)替換(采集、輸出時(shí)都可以替換)。
?。?)配合CNZZ的統計插件,能便捷實(shí)現下載明細統計和被采集的明細統計等。
?。?)本程序的手動(dòng)采集并非市面上常見(jiàn)的、關(guān)關(guān)、采集俠等,而是在DEDE原有采集功能的基礎上二次開(kāi)發(fā)的采集模塊,可以有效的保證章節內容的完整性,避免章節重復、章節內容無(wú)內容、章節亂碼等;一天24小時(shí)采集量能達到25~30萬(wàn)章節。
20140623更新后全面提高了本源碼程序的采集功能,使采集速度更快、更穩定,后臺可以單獨優(yōu)先采集某本小說(shuō),可以對無(wú)關(guān)緊要的章節手動(dòng)進(jìn)行過(guò)濾……
20140806更新后新增了【無(wú)縫換站采集功能】,當原先的采集目標站不能采集時(shí),可切換到其他目標站進(jìn)行采集,采集永不間斷,章節永遠;新增【自定義小說(shuō)封面頁(yè)URL】、【自定義作者頁(yè)URL】;任何對章節的操作(新增、修改、刪除、移動(dòng)、合并等)執行后均手動(dòng)更新小說(shuō)封面的功能……
20141110本支持自動(dòng)換站采集、自動(dòng)換站,半自動(dòng)添加單本采集,無(wú)采集規則或規則失效時(shí)手動(dòng)提醒功能……
采集模式降低為3種,增加目標站章節正序采集功能,能采集市面上99%的小說(shuō)站
20141205更新陌陌小說(shuō)模塊,可以在陌陌上看小說(shuō)……
20150306更新后臺全新的小說(shuō)管理面板,功能更強大,操作更簡(jiǎn)單。增加單本自定義換站采集功能,增加小說(shuō)百度指數查詢(xún),方便刪掉沒(méi)有指數的小說(shuō)。增加批量刪掉小說(shuō)、批量更新小說(shuō)簡(jiǎn)介頁(yè)面的功能。優(yōu)化全手動(dòng)采集功能,不需要任何采集工具,不需要打開(kāi)任何采集頁(yè)面,只要網(wǎng)站有流量,就能時(shí)間更新書(shū)友最喜歡看的小說(shuō),與源站更新時(shí)間差保持在5秒以?xún)取?br /> 20151020全新升級20多項功能,支持后臺直接更新程序....
本程序本為20160414版,低于些版本都為盜賣(mài)。
給諸位新站長(cháng)的友情提示:
不要相信這些所謂“有訪(fǎng)客下載時(shí)才手動(dòng)生成txt電子書(shū)”的外行說(shuō)法,因為提出這些概念的人可以肯定他不是站長(cháng)出生,沒(méi)有服務(wù)器資源需求的概念!這里說(shuō)明一下,txt電子書(shū)在生成的時(shí)侯是比較占用服務(wù)器資源的,同時(shí)生成1本小說(shuō)的txt電子書(shū)大約會(huì )占用5%~8%左右的CPU以及部份硬碟I/O,但是假如須要同時(shí)生成20本小說(shuō)的電子書(shū)的話(huà),你的服務(wù)器都會(huì )吃不消,如果同時(shí)須要生成更多的電子書(shū),那你的服務(wù)器就立刻奔潰了,整個(gè)網(wǎng)站都難以訪(fǎng)問(wèn)!如果使用須要下載的時(shí)侯再生成電子書(shū)的辦法,你就要考慮一下當你的網(wǎng)站同時(shí)有幾十個(gè)人在下載的時(shí)侯會(huì )是什么樣的情況了。 查看全部
全手動(dòng)采集版小說(shuō)網(wǎng)站不用管理
商品屬性
安裝環(huán)境
商品介紹
您能找到這個(gè)小說(shuō)源碼,說(shuō)明您準備用心建一個(gè)小說(shuō)網(wǎng)站,做站最重要的就是穩定更新和程序的不斷升級,你會(huì )選擇仍然不升級的源碼嗎?該小說(shuō)源碼程序,定期更新,請放心使用建站。為什么選擇dedecms做的這個(gè)程序做小說(shuō)網(wǎng),那是因為現今杰奇小說(shuō)程序和模板猖獗,您假如想從幾百萬(wàn)個(gè)一樣的網(wǎng)站中脫引而出這么就選擇這套dedecms開(kāi)發(fā)的源碼來(lái)建設您的網(wǎng)站嗎?大家都曉得國外SEO好友的程序源碼就是這個(gè)dedecms。還在遲疑哪些呢,趕快下手吧,建站和更新內容一樣,越早越好。
全網(wǎng)僅此一家為正版域名授權,如果有其他店面銷(xiāo)售,那肯定是二手或則山寨的了!
近期發(fā)覺(jué)有同行盜賣(mài)本店的程序,并且十分不厚道的說(shuō)是他自己開(kāi)發(fā)的,真是無(wú)語(yǔ)。
全新升級20151107版,支持:
百度主動(dòng)推送
百度站內搜索
后臺采集規則在線(xiàn)更新(目前預留)
多種章節內容儲存方法
微信小說(shuō)公眾號驗證平臺(支持微信公眾號自定義頂部菜單)
支持緩存功能等等,程序更快,負載更大!
重大更新,本程序被百度收錄后,主頁(yè)會(huì )手動(dòng)顯示logo,小說(shuō)目錄會(huì )手動(dòng)小說(shuō)模版適配:
還有好多功能是這些盜賣(mài)的難以提供的。
另外,本程序實(shí)行后臺在線(xiàn)更新后,其他盜賣(mài)的就難以繼續升級了,之前的更新都是直接提供更新包,而這些盜賣(mài)的就直接從群里拿了更新包說(shuō)是自己提供的更新包。 我們故意拖延了半年沒(méi)更新,結果就可想而知了......
我們的后臺還提供了更新歷史,可以查看每次更新了什么功能,并提供了新功能的使用說(shuō)明......
1、源碼類(lèi)型:整站源碼
2-1、環(huán)境要求:PHP5.2/5.3/5.4/5.5+MYSQL5(URLrewrite)
2-2、服務(wù)器要求:建議用40G數據盤(pán)以上的VPS或則獨立服務(wù)器,系統建議用Windows而不建議用Linux,99%的小說(shuō)站服務(wù)器是用Windows系統,方便文件管理以及備份等(目前演示站空間使用情況:6.5G數據庫+5G網(wǎng)頁(yè)空間,經(jīng)群內站友網(wǎng)站證實(shí):4核CPU+4G顯存的xen構架VPS能承受日5萬(wàn)IP、50萬(wàn)PV流量毫無(wú)壓力,每天收入700元以上)
3、原創(chuàng )程序:織夢(mèng)DEDECMS 5.7SP1
4、編碼類(lèi)型:GBK
5、可否采集:全手動(dòng)采集,贈送規則,好評后還可以免費訂制一條
6、演示站點(diǎn): ,自帶手機版:(可提供免費友情鏈接)
7、安裝升級:包安裝、附帶詳盡使用說(shuō)明,免費升級
8、其他特征:
?。?)自動(dòng)生成首頁(yè)、分類(lèi)、目錄、作者、排行榜、sitemap頁(yè)面靜態(tài)html。
?。?)全站拼音目錄化(可自定義URL格式),章節頁(yè)面偽靜態(tài)。
?。?)支持下載功能,可以手動(dòng)生成對應文本文件,可在文件中設置廣告。
?。?)自動(dòng)生成關(guān)鍵詞及關(guān)鍵詞手動(dòng)內鏈。
?。?)自動(dòng)偽原創(chuàng )成語(yǔ)替換(采集、輸出時(shí)都可以替換)。
?。?)配合CNZZ的統計插件,能便捷實(shí)現下載明細統計和被采集的明細統計等。
?。?)本程序的手動(dòng)采集并非市面上常見(jiàn)的、關(guān)關(guān)、采集俠等,而是在DEDE原有采集功能的基礎上二次開(kāi)發(fā)的采集模塊,可以有效的保證章節內容的完整性,避免章節重復、章節內容無(wú)內容、章節亂碼等;一天24小時(shí)采集量能達到25~30萬(wàn)章節。
20140623更新后全面提高了本源碼程序的采集功能,使采集速度更快、更穩定,后臺可以單獨優(yōu)先采集某本小說(shuō),可以對無(wú)關(guān)緊要的章節手動(dòng)進(jìn)行過(guò)濾……
20140806更新后新增了【無(wú)縫換站采集功能】,當原先的采集目標站不能采集時(shí),可切換到其他目標站進(jìn)行采集,采集永不間斷,章節永遠;新增【自定義小說(shuō)封面頁(yè)URL】、【自定義作者頁(yè)URL】;任何對章節的操作(新增、修改、刪除、移動(dòng)、合并等)執行后均手動(dòng)更新小說(shuō)封面的功能……
20141110本支持自動(dòng)換站采集、自動(dòng)換站,半自動(dòng)添加單本采集,無(wú)采集規則或規則失效時(shí)手動(dòng)提醒功能……
采集模式降低為3種,增加目標站章節正序采集功能,能采集市面上99%的小說(shuō)站
20141205更新陌陌小說(shuō)模塊,可以在陌陌上看小說(shuō)……
20150306更新后臺全新的小說(shuō)管理面板,功能更強大,操作更簡(jiǎn)單。增加單本自定義換站采集功能,增加小說(shuō)百度指數查詢(xún),方便刪掉沒(méi)有指數的小說(shuō)。增加批量刪掉小說(shuō)、批量更新小說(shuō)簡(jiǎn)介頁(yè)面的功能。優(yōu)化全手動(dòng)采集功能,不需要任何采集工具,不需要打開(kāi)任何采集頁(yè)面,只要網(wǎng)站有流量,就能時(shí)間更新書(shū)友最喜歡看的小說(shuō),與源站更新時(shí)間差保持在5秒以?xún)取?br /> 20151020全新升級20多項功能,支持后臺直接更新程序....
本程序本為20160414版,低于些版本都為盜賣(mài)。
給諸位新站長(cháng)的友情提示:
不要相信這些所謂“有訪(fǎng)客下載時(shí)才手動(dòng)生成txt電子書(shū)”的外行說(shuō)法,因為提出這些概念的人可以肯定他不是站長(cháng)出生,沒(méi)有服務(wù)器資源需求的概念!這里說(shuō)明一下,txt電子書(shū)在生成的時(shí)侯是比較占用服務(wù)器資源的,同時(shí)生成1本小說(shuō)的txt電子書(shū)大約會(huì )占用5%~8%左右的CPU以及部份硬碟I/O,但是假如須要同時(shí)生成20本小說(shuō)的電子書(shū)的話(huà),你的服務(wù)器都會(huì )吃不消,如果同時(shí)須要生成更多的電子書(shū),那你的服務(wù)器就立刻奔潰了,整個(gè)網(wǎng)站都難以訪(fǎng)問(wèn)!如果使用須要下載的時(shí)侯再生成電子書(shū)的辦法,你就要考慮一下當你的網(wǎng)站同時(shí)有幾十個(gè)人在下載的時(shí)侯會(huì )是什么樣的情況了。
web網(wǎng)路漏洞掃描器編撰
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 261 次瀏覽 ? 2020-08-18 00:36
這三天看了好多web漏洞掃描器編撰的文章,比如W12scan以及其前身W8scan,還有豬豬俠的自動(dòng)化功擊背景下的過(guò)去、現在與未來(lái),以及網(wǎng)上好多優(yōu)秀的掃描器和博客,除了之前寫(xiě)了一部分的靜湖ABC段掃描器,接下來(lái)有空的大部分時(shí)間就會(huì )用于編撰這個(gè)掃描器,相當于是對自己的一個(gè)階段性挑戰吧,也算是為了建立自己的技術(shù)棧。
因為想把掃描器弄成web應用,像W12scan,bugscan,AWVS那樣的,部署好了以后登錄,添加須要掃描的url,自動(dòng)化進(jìn)行漏洞掃描,首先須要將掃描器的web界面完成,也就是前前端弄好,漏洞掃描作為前面添加進(jìn)去的功能,在原基礎上進(jìn)行更改。
因為時(shí)間不是太充裕,所以選擇Flask框架進(jìn)行web的開(kāi)發(fā),學(xué)習的視頻是:
找了許久的視頻,要么就是太緊了,對于好多地方?jīng)]有講透徹,要么就是幾百集的教程丟過(guò)來(lái),過(guò)于冗長(cháng)。
文檔可以看官方文檔,或者是這個(gè):
當然遇見(jiàn)不會(huì )的問(wèn)題還須要微軟搜索一下,發(fā)揮自己的主觀(guān)能動(dòng)性。
接下來(lái)漸漸更新這一篇博客,先學(xué)Flask,哪里不會(huì )點(diǎn)技能樹(shù)的那里吧。當然也不能舍棄代碼審計,CTF和網(wǎng)課的學(xué)習
2020/4/2更新
框架快搭建好了,先做了登陸界面
然后掃描器的基礎功能也在readme上面寫(xiě)好了,側重的功能模塊是信息采集和FUZZ模塊
碎遮 Web漏洞掃描器
環(huán)境要求:
python版本要求:3.x,python運行需要的類(lèi)庫在requirements.txt中,執行
pip3 install -r requirements.txt
進(jìn)行類(lèi)庫的下載
主要功能:
一,輸入源采集:
1,基于流量清洗
2,基于日志提取
3,基于爬蟲(chóng)提取
二,輸入源信息搜集(+)
1,被動(dòng)信息搜集:(公開(kāi)渠道可獲得信息,與目標系統不產(chǎn)生直接交互)
1,whois 信息 獲取關(guān)鍵注冊人的信息 chinaz
2,在線(xiàn)子域名挖掘(這里不會(huì )ban掉自身IP,放進(jìn)被動(dòng)信息搜集中)
3,繞過(guò)CDN查找真實(shí)IP
4,DNS信息搜集
5,旁站查詢(xún)
6,云悉指紋
7,備案信息
8,搜索引擎搜索
9,備案查詢(xún)
2,主動(dòng)信息搜集:
1,旁站C段服務(wù)簡(jiǎn)單掃描
2,子域名爆破
3,CMS指紋識別
4,敏感目錄,文件掃描
5,端口及運行服務(wù)
6,服務(wù)器及中間件信息
7,WAF檢測
8,敏感信息泄露 .svn,.git 等等
9,登錄界面發(fā)現
三,SQL注入漏洞
四,XSS漏洞檢測
五,命令執行類(lèi)漏洞
六,文件包含類(lèi)漏洞
七,登錄弱密碼爆破
八,FUZZ模塊
可視化界面:
使用flask+javascript+html+css編寫(xiě)
啟動(dòng)index.py,在瀏覽器中訪(fǎng)問(wèn)127.0.0.1:5000訪(fǎng)問(wèn)
準備開(kāi)始模塊的編撰,加油趴
整個(gè)項目如今完成了1/3的樣子,因為自己缺少構架的經(jīng)驗,所以暫時(shí)只能走一步看一步,最開(kāi)始使用MySQL數據庫打算換成redis非關(guān)系型數據庫推動(dòng)讀寫(xiě)速率,掃描器在寫(xiě)的過(guò)程中豐富了自己對于各方面知識的把握
貼上W12scan的代碼構架鄉樓
從構架圖上面跟自己掃描器的看法進(jìn)行了一些驗證和補充。自己寫(xiě)的時(shí)侯應當不會(huì )用到elastic,可以考慮使用redis和MySQL數據庫兩個(gè)互相進(jìn)行配合儲存數據。
另外在掃描范圍上要進(jìn)行合法范圍的擴大化。 查看全部
web網(wǎng)路漏洞掃描器編撰
這三天看了好多web漏洞掃描器編撰的文章,比如W12scan以及其前身W8scan,還有豬豬俠的自動(dòng)化功擊背景下的過(guò)去、現在與未來(lái),以及網(wǎng)上好多優(yōu)秀的掃描器和博客,除了之前寫(xiě)了一部分的靜湖ABC段掃描器,接下來(lái)有空的大部分時(shí)間就會(huì )用于編撰這個(gè)掃描器,相當于是對自己的一個(gè)階段性挑戰吧,也算是為了建立自己的技術(shù)棧。
因為想把掃描器弄成web應用,像W12scan,bugscan,AWVS那樣的,部署好了以后登錄,添加須要掃描的url,自動(dòng)化進(jìn)行漏洞掃描,首先須要將掃描器的web界面完成,也就是前前端弄好,漏洞掃描作為前面添加進(jìn)去的功能,在原基礎上進(jìn)行更改。
因為時(shí)間不是太充裕,所以選擇Flask框架進(jìn)行web的開(kāi)發(fā),學(xué)習的視頻是:
找了許久的視頻,要么就是太緊了,對于好多地方?jīng)]有講透徹,要么就是幾百集的教程丟過(guò)來(lái),過(guò)于冗長(cháng)。
文檔可以看官方文檔,或者是這個(gè):
當然遇見(jiàn)不會(huì )的問(wèn)題還須要微軟搜索一下,發(fā)揮自己的主觀(guān)能動(dòng)性。
接下來(lái)漸漸更新這一篇博客,先學(xué)Flask,哪里不會(huì )點(diǎn)技能樹(shù)的那里吧。當然也不能舍棄代碼審計,CTF和網(wǎng)課的學(xué)習
2020/4/2更新
框架快搭建好了,先做了登陸界面

然后掃描器的基礎功能也在readme上面寫(xiě)好了,側重的功能模塊是信息采集和FUZZ模塊
碎遮 Web漏洞掃描器
環(huán)境要求:
python版本要求:3.x,python運行需要的類(lèi)庫在requirements.txt中,執行
pip3 install -r requirements.txt
進(jìn)行類(lèi)庫的下載
主要功能:
一,輸入源采集:
1,基于流量清洗
2,基于日志提取
3,基于爬蟲(chóng)提取
二,輸入源信息搜集(+)
1,被動(dòng)信息搜集:(公開(kāi)渠道可獲得信息,與目標系統不產(chǎn)生直接交互)
1,whois 信息 獲取關(guān)鍵注冊人的信息 chinaz
2,在線(xiàn)子域名挖掘(這里不會(huì )ban掉自身IP,放進(jìn)被動(dòng)信息搜集中)
3,繞過(guò)CDN查找真實(shí)IP
4,DNS信息搜集
5,旁站查詢(xún)
6,云悉指紋
7,備案信息
8,搜索引擎搜索
9,備案查詢(xún)
2,主動(dòng)信息搜集:
1,旁站C段服務(wù)簡(jiǎn)單掃描
2,子域名爆破
3,CMS指紋識別
4,敏感目錄,文件掃描
5,端口及運行服務(wù)
6,服務(wù)器及中間件信息
7,WAF檢測
8,敏感信息泄露 .svn,.git 等等
9,登錄界面發(fā)現
三,SQL注入漏洞
四,XSS漏洞檢測
五,命令執行類(lèi)漏洞
六,文件包含類(lèi)漏洞
七,登錄弱密碼爆破
八,FUZZ模塊
可視化界面:
使用flask+javascript+html+css編寫(xiě)
啟動(dòng)index.py,在瀏覽器中訪(fǎng)問(wèn)127.0.0.1:5000訪(fǎng)問(wèn)
準備開(kāi)始模塊的編撰,加油趴
整個(gè)項目如今完成了1/3的樣子,因為自己缺少構架的經(jīng)驗,所以暫時(shí)只能走一步看一步,最開(kāi)始使用MySQL數據庫打算換成redis非關(guān)系型數據庫推動(dòng)讀寫(xiě)速率,掃描器在寫(xiě)的過(guò)程中豐富了自己對于各方面知識的把握
貼上W12scan的代碼構架鄉樓

從構架圖上面跟自己掃描器的看法進(jìn)行了一些驗證和補充。自己寫(xiě)的時(shí)侯應當不會(huì )用到elastic,可以考慮使用redis和MySQL數據庫兩個(gè)互相進(jìn)行配合儲存數據。
另外在掃描范圍上要進(jìn)行合法范圍的擴大化。
第04期:Prometheus 數據采集(三)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 441 次瀏覽 ? 2020-08-17 22:27
本期作者:羅韋
愛(ài)可生上海研發(fā)中心成員,研發(fā)工程師,主要負責 DMP 平臺監控告警功能的相關(guān)工作。
Prometheus 的監控對象各式各樣,沒(méi)有統一標準。為了解決這個(gè)問(wèn)題,Prometheus 制定了一套監控規范,符合這個(gè)規范的樣本數據可以被 Prometheus 采集并解析樣本數據。Exporter 在 Prometheus 監控系統中是一個(gè)采集監控數據并通過(guò) Prometheus 監控規范對外提供數據的組件,針對不同的監控對象可以實(shí)現不同的 Exporter,這樣就解決了監控對象標準不一的問(wèn)題。從廣義上說(shuō),所有可以向 Prometheus 提供監控樣本數據的程序都可以稱(chēng)為 Exporter,Exporter 的實(shí)例也就是我們上期所說(shuō)的"target"。
Exporter 的運行方法Exporter 有兩種運行方法Exporter 接口數據規范
Exporter 通過(guò) HTTP 接口以文本方式向 Prometheus 暴露樣本數據,格式簡(jiǎn)單,沒(méi)有嵌套,可讀性強。每個(gè)監控指標對應的數據文本格式如下:
# HELP
# TYPE
{ =,=...}
{ =,=...}
...
# HELP x balabala
# TYPE x summary
x{quantile="0.5"} value1
x{quantile="0.9"} value2
x{quantile="0.99"} value3
x_sum sum(values)
x_count count(values)
# HELP x The temperature of cpu
# TYPE x histogram
x_bucket{le="20"} value1
x_bucket{le="50"} value2
x_bucket{le="70"} value3
x_bucket{le="+Inf"} count(values)
x_sum sum(values)
x_count count(values)
這樣的文本格式也有不足之處:
1. 文本內容可能過(guò)分繁瑣;
2. Prometheus 在解析時(shí)不能校準 HELP 和 TYPE 字段是否缺位,如果缺位 HELP 字段,這條樣本數據的來(lái)源可能就無(wú)法判定;如果缺位 TYPE 字段,Prometheus 對這條樣本數據的類(lèi)型就無(wú)從得悉;
3. 相比于 protobuf,Prometheus 使用的文本格式?jīng)]有做任何壓縮處理,解析成本較高。
MySQL Server Exporter
針對被廣泛使用的關(guān)系型數據庫 MySQL,Prometheus 官方提供了 MySQL Server Exporter,支持 MySQL 5.6 及以上版本,對于 5.6 以下的版本,部分監控指標可能不支持。
MySQL Server Exporter 監控的信息包括了常用的 global status/variables 信息、schema/table 的統計信息、user 統計信息、innodb 的信息以及主從復制、組復制的信息,監控指標比較全面。但是因為它提供的監控指標中缺乏對 MySQL 實(shí)例的標示,所以當一臺主機上存在多個(gè) MySQL 實(shí)例,需要運行多個(gè) MySQL Server Exporter 進(jìn)行監控時(shí),就會(huì )無(wú)法分辨實(shí)例信息。具體使用方法可參考:
Node Exporter
Prometheus 官方的 Node Exporter 提供對 *NIX 系統、硬件信息的監控,監控指標包括 CPU 使用率/配置、系統平均負載、內存信息、網(wǎng)絡(luò )狀況、文件系統信息統計、磁盤(pán)使用情況統計等。對于不同的系統,監控指標會(huì )有所差別,如 diskstats 支持 Darwin, Linux, OpenBSD 系統;loadavg 支持 Darwin, Dragonfly, FreeBSD, Linux, NetBSD, OpenBSD, Solaris 系統。Node Exporter 的監控指標沒(méi)有對主機身分的標示,可以通過(guò) relabel 功能在 Prometheus Server 端降低一些標示標簽。具體使用方法可參考:
如何實(shí)現一個(gè) Exporter編撰一個(gè)簡(jiǎn)單的 Exporter
使用 prometheus/client_golang 包,我們來(lái)編撰一個(gè)簡(jiǎn)單的 Exporter,包括 Prometheus 支持的四種監控指標類(lèi)型
package main
import (
"log"
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
//使用GaugeVec類(lèi)型可以為監控指標設置標簽,這里為監控指標增加一個(gè)標簽"device"
speed = prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "disk_available_bytes",
Help: "Disk space available in bytes",
}, []string{"device"})
tasksTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: "test_tasks_total",
Help: "Total number of test tasks",
})
taskDuration = prometheus.NewSummary(prometheus.SummaryOpts{
Name: "task_duration_seconds",
Help: "Duration of task in seconds",
//Summary類(lèi)型的監控指標需要提供分位點(diǎn)
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
})
cpuTemperature = prometheus.NewHistogram(prometheus.HistogramOpts{
Name: "cpu_temperature",
Help: "The temperature of cpu",
//Histogram類(lèi)型的監控指標需要提供Bucket
Buckets: []float64{20, 50, 70, 80},
})
)
func init() {
//注冊監控指標
prometheus.MustRegister(speed)
prometheus.MustRegister(tasksTotal)
prometheus.MustRegister(taskDuration)
prometheus.MustRegister(cpuTemperature)
}
func main() {
//模擬采集監控數據
fakeData()
//使用prometheus提供的promhttp.Handler()暴露監控樣本數據
//prometheus默認從"/metrics"接口拉取監控樣本數據
http.Handle("/metrics", promhttp.Handler())
log.Fatal(http.ListenAndServe(":10000", nil))
}
func fakeData() {
tasksTotal.Inc()
//設置該條樣本數據的"device"標簽值為"/dev/sda"
speed.With(prometheus.Labels{"device": "/dev/sda"}).Set(82115880)
taskDuration.Observe(10)
taskDuration.Observe(20)
taskDuration.Observe(30)
taskDuration.Observe(45)
taskDuration.Observe(56)
taskDuration.Observe(80)
cpuTemperature.Observe(30)
cpuTemperature.Observe(43)
cpuTemperature.Observe(56)
cpuTemperature.Observe(58)
cpuTemperature.Observe(65)
cpuTemperature.Observe(70)
}
接下來(lái)編譯、運行我們的 Exporter
GOOS=linux GOARCH=amd64 go build -o my_exporter main.go
./my_exporter &
Exporter 運行上去以后,還要在 Prometheus 的配置文件中加入 Exporter 信息,Prometheus 才能從 Exporter 拉取數據。
static_configs:
- targets: ['localhost:9090','172.17.0.3:10000']
在 Prometheus 的 targets 頁(yè)面可以看見(jiàn)剛剛新增的 Exporter 了
untitled.png
訪(fǎng)問(wèn)"/metrics"接口可以找到如下數據:
Gauge
因為我們使用了 GaugeVec,所以形成了帶標簽的樣本數據
# HELP disk_available_bytes disk space available in bytes
# TYPE disk_available_bytes gauge
disk_available_bytes{device="/dev/sda"} 8.211588e+07
Counter
# HELP test_tasks_total total number of test tasks
# TYPE test_tasks_total counter
test_tasks_total 1
Summary
# HELP task_duration_seconds Duration of task in seconds
# TYPE task_duration_seconds summary
task_duration_seconds{quantile="0.5"} 30
task_duration_seconds{quantile="0.9"} 80
task_duration_seconds{quantile="0.99"} 80
task_duration_seconds_sum 241
task_duration_seconds_count 6
Histogram
# HELP cpu_temperature The temperature of cpu
# TYPE cpu_temperature histogram
cpu_temperature_bucket{le="20"} 0
cpu_temperature_bucket{le="50"} 2
cpu_temperature_bucket{le="70"} 6
cpu_temperature_bucket{le="80"} 6
cpu_temperature_bucket{le="+Inf"} 6
cpu_temperature_sum 322
cpu_temperature_count 6
Exporter實(shí)現方法的審視
上面的板栗中,我們在程序一開(kāi)始就初始化所有的監控指標,這種方案一般接下來(lái)會(huì )開(kāi)啟一個(gè)取樣解釋器去定期采集、更新監控指標的樣本數據,最新的樣本數據將仍然保留在顯存中,在接到 Prometheus Server 的懇求時(shí),返回顯存里的樣本數據。這個(gè)方案的優(yōu)點(diǎn)在于,易于控制取樣頻度;不用害怕并發(fā)取樣可能帶來(lái)的資源占據問(wèn)題。不足之處有:
1. 由于樣本數據不會(huì )被手動(dòng)清除,當某個(gè)已被取樣的采集對象失效了,Prometheus Server 依然能拉取到它的樣本數據,只是這個(gè)數據從監控對象失效時(shí)就早已不會(huì )再被更新。這就須要 Exporter 自己提供一個(gè)對無(wú)效監控對象的數據清除機制;
2. 由于響應 Prometheus Server 的懇求是從顯存里取數據,如果 Exporter 的取樣解釋器異??ㄗ?,Prometheus Server 也難以感知,拉取到的數據可能是過(guò)期數據;
3. Prometheus Server 拉取的數據不是即時(shí)取樣的,對于某時(shí)間點(diǎn)的數據一致性不能保證。
另一種方案是 MySQL Server Exporter 和 Node Exporter 采用的,也是 Prometheus 官方推薦的方案。該方案是在每次接到 Prometheus Server 的懇求時(shí),初始化新的監控指標,開(kāi)啟一個(gè)取樣解釋器。和方案一不同的是,這些監控指標只在懇求期間存活。然后取樣解釋器會(huì )去采集所有樣本數據并返回給 Prometheus Server。相比于方案一,方案二的數據是即時(shí)拉取的,可以保證時(shí)間點(diǎn)的數據一致性;因為監控指標會(huì )在每次懇求時(shí)重新初始化,所以也不會(huì )存在失效的樣本數據。不過(guò)方案二同樣有不足之處:
1. 當多個(gè)拉取懇求同時(shí)發(fā)生時(shí),需要控制并發(fā)采集樣本的資源消耗;
2. 當多個(gè)拉取懇求同時(shí)發(fā)生時(shí),在短時(shí)間內須要對同一個(gè)監控指標讀取多次,對于一個(gè)變化頻度較低的監控指標來(lái)說(shuō),多次讀取意義不大,卻降低了對資源的占用。
相關(guān)內容方面的知識,大家還有哪些疑惑或則想知道的嗎?趕緊留言告訴小編吧! 查看全部
第04期:Prometheus 數據采集(三)

本期作者:羅韋
愛(ài)可生上海研發(fā)中心成員,研發(fā)工程師,主要負責 DMP 平臺監控告警功能的相關(guān)工作。
Prometheus 的監控對象各式各樣,沒(méi)有統一標準。為了解決這個(gè)問(wèn)題,Prometheus 制定了一套監控規范,符合這個(gè)規范的樣本數據可以被 Prometheus 采集并解析樣本數據。Exporter 在 Prometheus 監控系統中是一個(gè)采集監控數據并通過(guò) Prometheus 監控規范對外提供數據的組件,針對不同的監控對象可以實(shí)現不同的 Exporter,這樣就解決了監控對象標準不一的問(wèn)題。從廣義上說(shuō),所有可以向 Prometheus 提供監控樣本數據的程序都可以稱(chēng)為 Exporter,Exporter 的實(shí)例也就是我們上期所說(shuō)的"target"。
Exporter 的運行方法Exporter 有兩種運行方法Exporter 接口數據規范
Exporter 通過(guò) HTTP 接口以文本方式向 Prometheus 暴露樣本數據,格式簡(jiǎn)單,沒(méi)有嵌套,可讀性強。每個(gè)監控指標對應的數據文本格式如下:
# HELP
# TYPE
{ =,=...}
{ =,=...}
...
# HELP x balabala
# TYPE x summary
x{quantile="0.5"} value1
x{quantile="0.9"} value2
x{quantile="0.99"} value3
x_sum sum(values)
x_count count(values)
# HELP x The temperature of cpu
# TYPE x histogram
x_bucket{le="20"} value1
x_bucket{le="50"} value2
x_bucket{le="70"} value3
x_bucket{le="+Inf"} count(values)
x_sum sum(values)
x_count count(values)
這樣的文本格式也有不足之處:
1. 文本內容可能過(guò)分繁瑣;
2. Prometheus 在解析時(shí)不能校準 HELP 和 TYPE 字段是否缺位,如果缺位 HELP 字段,這條樣本數據的來(lái)源可能就無(wú)法判定;如果缺位 TYPE 字段,Prometheus 對這條樣本數據的類(lèi)型就無(wú)從得悉;
3. 相比于 protobuf,Prometheus 使用的文本格式?jīng)]有做任何壓縮處理,解析成本較高。
MySQL Server Exporter
針對被廣泛使用的關(guān)系型數據庫 MySQL,Prometheus 官方提供了 MySQL Server Exporter,支持 MySQL 5.6 及以上版本,對于 5.6 以下的版本,部分監控指標可能不支持。
MySQL Server Exporter 監控的信息包括了常用的 global status/variables 信息、schema/table 的統計信息、user 統計信息、innodb 的信息以及主從復制、組復制的信息,監控指標比較全面。但是因為它提供的監控指標中缺乏對 MySQL 實(shí)例的標示,所以當一臺主機上存在多個(gè) MySQL 實(shí)例,需要運行多個(gè) MySQL Server Exporter 進(jìn)行監控時(shí),就會(huì )無(wú)法分辨實(shí)例信息。具體使用方法可參考:
Node Exporter
Prometheus 官方的 Node Exporter 提供對 *NIX 系統、硬件信息的監控,監控指標包括 CPU 使用率/配置、系統平均負載、內存信息、網(wǎng)絡(luò )狀況、文件系統信息統計、磁盤(pán)使用情況統計等。對于不同的系統,監控指標會(huì )有所差別,如 diskstats 支持 Darwin, Linux, OpenBSD 系統;loadavg 支持 Darwin, Dragonfly, FreeBSD, Linux, NetBSD, OpenBSD, Solaris 系統。Node Exporter 的監控指標沒(méi)有對主機身分的標示,可以通過(guò) relabel 功能在 Prometheus Server 端降低一些標示標簽。具體使用方法可參考:
如何實(shí)現一個(gè) Exporter編撰一個(gè)簡(jiǎn)單的 Exporter
使用 prometheus/client_golang 包,我們來(lái)編撰一個(gè)簡(jiǎn)單的 Exporter,包括 Prometheus 支持的四種監控指標類(lèi)型
package main
import (
"log"
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
//使用GaugeVec類(lèi)型可以為監控指標設置標簽,這里為監控指標增加一個(gè)標簽"device"
speed = prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "disk_available_bytes",
Help: "Disk space available in bytes",
}, []string{"device"})
tasksTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: "test_tasks_total",
Help: "Total number of test tasks",
})
taskDuration = prometheus.NewSummary(prometheus.SummaryOpts{
Name: "task_duration_seconds",
Help: "Duration of task in seconds",
//Summary類(lèi)型的監控指標需要提供分位點(diǎn)
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
})
cpuTemperature = prometheus.NewHistogram(prometheus.HistogramOpts{
Name: "cpu_temperature",
Help: "The temperature of cpu",
//Histogram類(lèi)型的監控指標需要提供Bucket
Buckets: []float64{20, 50, 70, 80},
})
)
func init() {
//注冊監控指標
prometheus.MustRegister(speed)
prometheus.MustRegister(tasksTotal)
prometheus.MustRegister(taskDuration)
prometheus.MustRegister(cpuTemperature)
}
func main() {
//模擬采集監控數據
fakeData()
//使用prometheus提供的promhttp.Handler()暴露監控樣本數據
//prometheus默認從"/metrics"接口拉取監控樣本數據
http.Handle("/metrics", promhttp.Handler())
log.Fatal(http.ListenAndServe(":10000", nil))
}
func fakeData() {
tasksTotal.Inc()
//設置該條樣本數據的"device"標簽值為"/dev/sda"
speed.With(prometheus.Labels{"device": "/dev/sda"}).Set(82115880)
taskDuration.Observe(10)
taskDuration.Observe(20)
taskDuration.Observe(30)
taskDuration.Observe(45)
taskDuration.Observe(56)
taskDuration.Observe(80)
cpuTemperature.Observe(30)
cpuTemperature.Observe(43)
cpuTemperature.Observe(56)
cpuTemperature.Observe(58)
cpuTemperature.Observe(65)
cpuTemperature.Observe(70)
}
接下來(lái)編譯、運行我們的 Exporter
GOOS=linux GOARCH=amd64 go build -o my_exporter main.go
./my_exporter &
Exporter 運行上去以后,還要在 Prometheus 的配置文件中加入 Exporter 信息,Prometheus 才能從 Exporter 拉取數據。
static_configs:
- targets: ['localhost:9090','172.17.0.3:10000']
在 Prometheus 的 targets 頁(yè)面可以看見(jiàn)剛剛新增的 Exporter 了

untitled.png
訪(fǎng)問(wèn)"/metrics"接口可以找到如下數據:
Gauge
因為我們使用了 GaugeVec,所以形成了帶標簽的樣本數據
# HELP disk_available_bytes disk space available in bytes
# TYPE disk_available_bytes gauge
disk_available_bytes{device="/dev/sda"} 8.211588e+07
Counter
# HELP test_tasks_total total number of test tasks
# TYPE test_tasks_total counter
test_tasks_total 1
Summary
# HELP task_duration_seconds Duration of task in seconds
# TYPE task_duration_seconds summary
task_duration_seconds{quantile="0.5"} 30
task_duration_seconds{quantile="0.9"} 80
task_duration_seconds{quantile="0.99"} 80
task_duration_seconds_sum 241
task_duration_seconds_count 6
Histogram
# HELP cpu_temperature The temperature of cpu
# TYPE cpu_temperature histogram
cpu_temperature_bucket{le="20"} 0
cpu_temperature_bucket{le="50"} 2
cpu_temperature_bucket{le="70"} 6
cpu_temperature_bucket{le="80"} 6
cpu_temperature_bucket{le="+Inf"} 6
cpu_temperature_sum 322
cpu_temperature_count 6
Exporter實(shí)現方法的審視
上面的板栗中,我們在程序一開(kāi)始就初始化所有的監控指標,這種方案一般接下來(lái)會(huì )開(kāi)啟一個(gè)取樣解釋器去定期采集、更新監控指標的樣本數據,最新的樣本數據將仍然保留在顯存中,在接到 Prometheus Server 的懇求時(shí),返回顯存里的樣本數據。這個(gè)方案的優(yōu)點(diǎn)在于,易于控制取樣頻度;不用害怕并發(fā)取樣可能帶來(lái)的資源占據問(wèn)題。不足之處有:
1. 由于樣本數據不會(huì )被手動(dòng)清除,當某個(gè)已被取樣的采集對象失效了,Prometheus Server 依然能拉取到它的樣本數據,只是這個(gè)數據從監控對象失效時(shí)就早已不會(huì )再被更新。這就須要 Exporter 自己提供一個(gè)對無(wú)效監控對象的數據清除機制;
2. 由于響應 Prometheus Server 的懇求是從顯存里取數據,如果 Exporter 的取樣解釋器異??ㄗ?,Prometheus Server 也難以感知,拉取到的數據可能是過(guò)期數據;
3. Prometheus Server 拉取的數據不是即時(shí)取樣的,對于某時(shí)間點(diǎn)的數據一致性不能保證。
另一種方案是 MySQL Server Exporter 和 Node Exporter 采用的,也是 Prometheus 官方推薦的方案。該方案是在每次接到 Prometheus Server 的懇求時(shí),初始化新的監控指標,開(kāi)啟一個(gè)取樣解釋器。和方案一不同的是,這些監控指標只在懇求期間存活。然后取樣解釋器會(huì )去采集所有樣本數據并返回給 Prometheus Server。相比于方案一,方案二的數據是即時(shí)拉取的,可以保證時(shí)間點(diǎn)的數據一致性;因為監控指標會(huì )在每次懇求時(shí)重新初始化,所以也不會(huì )存在失效的樣本數據。不過(guò)方案二同樣有不足之處:
1. 當多個(gè)拉取懇求同時(shí)發(fā)生時(shí),需要控制并發(fā)采集樣本的資源消耗;
2. 當多個(gè)拉取懇求同時(shí)發(fā)生時(shí),在短時(shí)間內須要對同一個(gè)監控指標讀取多次,對于一個(gè)變化頻度較低的監控指標來(lái)說(shuō),多次讀取意義不大,卻降低了對資源的占用。
相關(guān)內容方面的知識,大家還有哪些疑惑或則想知道的嗎?趕緊留言告訴小編吧!
Golddata怎么采集需要登入/會(huì )話(huà)的數據?
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 354 次瀏覽 ? 2020-08-14 14:05
點(diǎn)擊“采集管理》網(wǎng)站管理”,點(diǎn)擊“添加”按扭,添加名為mydict的站點(diǎn)。如下所示:
接下來(lái)配制登陸和檢測會(huì )話(huà)腳本,點(diǎn)擊“設置半自動(dòng)登陸”,會(huì )打開(kāi)站點(diǎn)半自動(dòng)登陸配制頁(yè)面,如下圖所示:
登錄腳本如下:
//發(fā)送ajax請求驗證碼
var va=$ajax('http://localhost:8080/code/vcode?timestamp=1554001708730',{encoding:false});
var arg_={
label:site.name+"驗證碼",
type:1,
content:va.content
}
//waitForInput內置函數將發(fā)送郵件,并等待輸入
//(回復郵件,或者goldData平臺輸入),
//并把輸入內容當作驗證碼返回。
var code=waitForInput(arg_);
var data="username=admin&password=admin&vcode="+code
var m=new Map()
m.put('Cookie',va.cookie)
//發(fā)送ajax請求執行登錄
var content=$ajax('http://localhost:8080/doLogin',{method:'POST',headers:m,data:data})
//如果正確,將返回狀態(tài)1(登錄成功),和headers信息給GoldData,
//否則返回0(登錄失?。?!
if(content.headers){
m.putAll(content.headers)
}
var ret={status:1,headers:m}
if(content.status!=200){
ret.status=0
}
ret
檢查腳本如下:
var ret=true;
if(html.contains("我的單詞-登錄")){
ret=false
}
ret;
配制好以后,我們回到網(wǎng)站管理頁(yè)面,點(diǎn)擊“啟動(dòng)登陸”,則會(huì )開(kāi)始執行“自動(dòng)登入”,這以后,點(diǎn)擊“查詢(xún)”按扭來(lái)刷新頁(yè)面,可以見(jiàn)到“等待輸入”的狀態(tài)。如下圖所示:
此時(shí),您設置的通知郵箱,也應當同時(shí)收到了電郵。點(diǎn)開(kāi)電郵,或者點(diǎn)擊頁(yè)面上的“錄入等待輸入”按扭,將會(huì )聽(tīng)到如下內容:
依據電郵內容,回復電郵“{{qcxe}}”,就可以使程序繼續執行。在golddata頁(yè)面里輸入"qcxe",效果是一樣的。程序將會(huì )回到“waitForInput()”,并且返回輸入的內容。
回復以后,我們將在golddata頁(yè)面里,點(diǎn)擊“查詢(xún)”刷新頁(yè)面,mydict的登陸狀態(tài)會(huì )變?yōu)椤耙训顷憽?。如下圖所示:
接下來(lái),我們可以定義抓取規則。
定義抓取規則
在添加規則之前,我們還須要定義類(lèi)似于表結構的數據集。如下圖所示:
接下來(lái),點(diǎn)擊“采集管理》規則管理”,添加規則,打開(kāi)添加規則頁(yè)面,如下圖所示:
抓取規則腳本如下:
[
{
__sample: http://localhost:8080/word/index?pageNum=2
match0: http\:\/\/localhost\:8080\/word\/index(\?pageNum=\d+)?
fields0:
{
__model: true
__dataset: word
__node: "#content ul >li"
sn:
{
expr: ""
attr: ""
js: md5(item.name)
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
name:
{
expr: h5
attr: ""
js: ""
__label: ""
__showOnList: true
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
uk:
{
expr: li span.uk
attr: ""
js: source.replace("uk: ",'')
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
us:
{
expr: li span.us
attr: ""
js: source.replace("us: ",'')
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
}
fields1:
{
__node: .pagination a
href:
{
expr: a
attr: abs:href
js: ""
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
}
}
]
然后點(diǎn)擊測試,將會(huì )進(jìn)行測試抓取。我們發(fā)覺(jué)數據的確被抓取到了,如下圖所示:
配制抓取器抓取
這和之前是一樣的,將抓取器設置抓取站點(diǎn)“mydict”.然后點(diǎn)擊開(kāi)始抓取。然后會(huì )在數據管理上面查看抓取的數據。
結論
GoldData半自動(dòng)登陸實(shí)質(zhì)是提供了一個(gè)可以人工介入來(lái)異步獲取會(huì )話(huà)的框架,既可以調用AI插口做到完全手動(dòng)登入;也可以將類(lèi)似于驗證碼須要復雜辨識須要提供輸入時(shí),直接將cookie或則token信息通過(guò)短信收發(fā)到GoldData平臺(這樣可以不管CAPTCHA多復雜 ),都可以使GoldData抓取數據的動(dòng)作持續進(jìn)行下去。 查看全部
編寫(xiě)登陸和檢測會(huì )話(huà)腳本
點(diǎn)擊“采集管理》網(wǎng)站管理”,點(diǎn)擊“添加”按扭,添加名為mydict的站點(diǎn)。如下所示:

接下來(lái)配制登陸和檢測會(huì )話(huà)腳本,點(diǎn)擊“設置半自動(dòng)登陸”,會(huì )打開(kāi)站點(diǎn)半自動(dòng)登陸配制頁(yè)面,如下圖所示:

登錄腳本如下:
//發(fā)送ajax請求驗證碼
var va=$ajax('http://localhost:8080/code/vcode?timestamp=1554001708730',{encoding:false});
var arg_={
label:site.name+"驗證碼",
type:1,
content:va.content
}
//waitForInput內置函數將發(fā)送郵件,并等待輸入
//(回復郵件,或者goldData平臺輸入),
//并把輸入內容當作驗證碼返回。
var code=waitForInput(arg_);
var data="username=admin&password=admin&vcode="+code
var m=new Map()
m.put('Cookie',va.cookie)
//發(fā)送ajax請求執行登錄
var content=$ajax('http://localhost:8080/doLogin',{method:'POST',headers:m,data:data})
//如果正確,將返回狀態(tài)1(登錄成功),和headers信息給GoldData,
//否則返回0(登錄失?。?!
if(content.headers){
m.putAll(content.headers)
}
var ret={status:1,headers:m}
if(content.status!=200){
ret.status=0
}
ret
檢查腳本如下:
var ret=true;
if(html.contains("我的單詞-登錄")){
ret=false
}
ret;
配制好以后,我們回到網(wǎng)站管理頁(yè)面,點(diǎn)擊“啟動(dòng)登陸”,則會(huì )開(kāi)始執行“自動(dòng)登入”,這以后,點(diǎn)擊“查詢(xún)”按扭來(lái)刷新頁(yè)面,可以見(jiàn)到“等待輸入”的狀態(tài)。如下圖所示:

此時(shí),您設置的通知郵箱,也應當同時(shí)收到了電郵。點(diǎn)開(kāi)電郵,或者點(diǎn)擊頁(yè)面上的“錄入等待輸入”按扭,將會(huì )聽(tīng)到如下內容:


依據電郵內容,回復電郵“{{qcxe}}”,就可以使程序繼續執行。在golddata頁(yè)面里輸入"qcxe",效果是一樣的。程序將會(huì )回到“waitForInput()”,并且返回輸入的內容。
回復以后,我們將在golddata頁(yè)面里,點(diǎn)擊“查詢(xún)”刷新頁(yè)面,mydict的登陸狀態(tài)會(huì )變?yōu)椤耙训顷憽?。如下圖所示:

接下來(lái),我們可以定義抓取規則。
定義抓取規則
在添加規則之前,我們還須要定義類(lèi)似于表結構的數據集。如下圖所示:

接下來(lái),點(diǎn)擊“采集管理》規則管理”,添加規則,打開(kāi)添加規則頁(yè)面,如下圖所示:

抓取規則腳本如下:
[
{
__sample: http://localhost:8080/word/index?pageNum=2
match0: http\:\/\/localhost\:8080\/word\/index(\?pageNum=\d+)?
fields0:
{
__model: true
__dataset: word
__node: "#content ul >li"
sn:
{
expr: ""
attr: ""
js: md5(item.name)
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
name:
{
expr: h5
attr: ""
js: ""
__label: ""
__showOnList: true
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
uk:
{
expr: li span.uk
attr: ""
js: source.replace("uk: ",'')
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
us:
{
expr: li span.us
attr: ""
js: source.replace("us: ",'')
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
}
fields1:
{
__node: .pagination a
href:
{
expr: a
attr: abs:href
js: ""
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
}
}
]
然后點(diǎn)擊測試,將會(huì )進(jìn)行測試抓取。我們發(fā)覺(jué)數據的確被抓取到了,如下圖所示:

配制抓取器抓取
這和之前是一樣的,將抓取器設置抓取站點(diǎn)“mydict”.然后點(diǎn)擊開(kāi)始抓取。然后會(huì )在數據管理上面查看抓取的數據。
結論
GoldData半自動(dòng)登陸實(shí)質(zhì)是提供了一個(gè)可以人工介入來(lái)異步獲取會(huì )話(huà)的框架,既可以調用AI插口做到完全手動(dòng)登入;也可以將類(lèi)似于驗證碼須要復雜辨識須要提供輸入時(shí),直接將cookie或則token信息通過(guò)短信收發(fā)到GoldData平臺(這樣可以不管CAPTCHA多復雜 ),都可以使GoldData抓取數據的動(dòng)作持續進(jìn)行下去。
python爬蟲(chóng)實(shí)踐教學(xué)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 619 次瀏覽 ? 2020-08-13 14:47
一、前言
這篇文章之前是給新人培訓時(shí)用的,大家覺(jué)的很好理解的,所以就分享下來(lái),與你們一起學(xué)習。如果你學(xué)過(guò)一些python,想用它做些什么又沒(méi)有方向,不妨試試完成下邊幾個(gè)案例。
二、環(huán)境打算
安裝requests lxml beautifulsoup4三個(gè)庫(下面代碼均在python3.5環(huán)境下通過(guò)測試)
pip install requests lxml beautifulsoup4
三、幾個(gè)爬蟲(chóng)小案例3.1 獲取本機公網(wǎng)IP地址
利用公網(wǎng)上查詢(xún)IP的托詞,使用python的requests庫,自動(dòng)獲取IP地址。
import requests
r = requests.get("http://2017.ip138.com/ic.asp")
r.encoding = r.apparent_encoding? ?? ???#使用requests的字符編碼智能分析,避免中文亂碼
print(r.text)
# 你還可以使用正則匹配re模塊提取出IP
import re
print(re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",r.text))
3.2 利用百度搜索插口,編寫(xiě)url采集器
這個(gè)案例中,我們要使用requests結合BeautifulSoup庫來(lái)完成任務(wù)。我們要在程序中設置User-Agent頭,繞過(guò)百度搜索引擎的反爬蟲(chóng)機制(你可以試試不加User-Agent頭,看看能不能獲取到數據)。注意觀(guān)察百度搜索結構的URL鏈接規律,例如第一頁(yè)的url鏈接參數pn=0,第二頁(yè)的url鏈接參數pn=10…. 依次類(lèi)推。這里,我們使用css選擇器路徑提取數據。
import requests
from bs4 import BeautifulSoup
# 設置User-Agent頭,繞過(guò)百度搜索引擎的反爬蟲(chóng)機制
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'}
# 注意觀(guān)察百度搜索結構的URL鏈接規律,例如第一頁(yè)pn=0,第二頁(yè)pn=10.... 依次類(lèi)推,下面的for循環(huán)搜索前10頁(yè)結果
for i in range(0,100,10):
? ?? ???bd_search = "https://www.baidu.com/s%3Fwd%3 ... ot%3B % str(i)
? ?? ???r = requests.get(bd_search,headers=headers)
? ?? ???soup = BeautifulSoup(r.text,"lxml")
? ? # 下面的select使用了css選擇器路徑提取數據
? ?? ???url_list = soup.select(".t > a")
? ?? ???for url in url_list:
? ?? ?? ?? ?? ? real_url = url["href"]
? ?? ?? ?? ?? ? r = requests.get(real_url)
? ?? ?? ?? ?? ? print(r.url)
編寫(xiě)好程序后,我們使用關(guān)鍵詞inurl:/dede/login.php來(lái)批量提取織夢(mèng)cms的后臺地址,效果如下:
3.3 自動(dòng)下載搜狗壁紙
這個(gè)反例,我們將通過(guò)爬蟲(chóng)來(lái)手動(dòng)下載搜過(guò)墻紙,程序中儲存圖片的路徑改成你自己想要儲存圖片的目錄路徑即可。還有一點(diǎn),程序中我們用到了json庫,這是因為在觀(guān)察中,發(fā)現搜狗壁紙的地址是以json格式儲存,所以我們以json來(lái)解析這組數據。
import requests
import json
#下載圖片
url = "http://pic.sogou.com/pics/chan ... ot%3B
r = requests.get(url)
data = json.loads(r.text)
for i in data["all_items"]:
? ? img_url = i["pic_url"]
? ? # 下面這行里面的路徑改成你自己想要存放圖片的目錄路徑即可
? ? with open("/home/evilk0/Desktop/img/%s" % img_url[-10:]+".jpg","wb") as f:
? ?? ???r2 = requests.get(img_url)
? ?? ???f.write(r2.content)
? ? print("下載完畢:",img_url)
3.4 自動(dòng)填寫(xiě)調查問(wèn)卷
目標官網(wǎng):
目標問(wèn)卷:
import requests
import random
url = "https://www.wjx.cn/joinnew/pro ... ot%3B
data = {
? ? "submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
}
header = {
? ? "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)",
? ? "Cookie": ".ASPXANONYMOUS=iBuvxgz20wEkAAAAZGY4MDE1MjctNWU4Ni00MDUwLTgwYjQtMjFhMmZhMDE2MTA3h_bb3gNw4XRPsyh-qPh4XW1mfJ41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; UM_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100CBE37C329C8A3EEEEE289B573446F594297CC3BB3C355F09187F5ADCC492EBB07A9CC65CD43AD3E795C914CD57017EE3799E92F0E2762C963EF0912; WjxUser=UserName=17750277425&Type=1; LastCheckUpdateDate=1; LastCheckDesign=1; DeleteQCookie=1; _cnzz_CV4478442=%E7%94%A8%E6%88%B7%E7%89%88%E6%9C%AC%7C%E5%85%8D%E8%B4%B9%E7%89%88%7C1521461468568; jac21581199=78751211; CNZZDATA4478442=cnzz_eid%3D878068609-1521456533-https%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1521461319; Hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; Hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471",
}
for i in range(0,500):
? ? choice = (
? ?? ???random.randint(1, 2),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ? )
? ? data["submitdata"] = data["submitdata"] % choice
? ? r = requests.post(url = url,headers=header,data=data)
? ? print(r.text)
? ? data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
當我們使用同一個(gè)IP遞交多個(gè)問(wèn)卷時(shí),會(huì )觸發(fā)目標的反爬蟲(chóng)機制,服務(wù)器會(huì )出現驗證碼。
我們可以使用X-Forwarded-For來(lái)偽造我們的IP,修改后代碼如下:
import requests
import random
url = "https://www.wjx.cn/joinnew/pro ... ot%3B
data = {
? ? "submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
}
header = {
? ? "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)",
? ? "Cookie": ".ASPXANONYMOUS=iBuvxgz20wEkAAAAZGY4MDE1MjctNWU4Ni00MDUwLTgwYjQtMjFhMmZhMDE2MTA3h_bb3gNw4XRPsyh-qPh4XW1mfJ41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; UM_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100CBE37C329C8A3EEEEE289B573446F594297CC3BB3C355F09187F5ADCC492EBB07A9CC65CD43AD3E795C914CD57017EE3799E92F0E2762C963EF0912; WjxUser=UserName=17750277425&Type=1; LastCheckUpdateDate=1; LastCheckDesign=1; DeleteQCookie=1; _cnzz_CV4478442=%E7%94%A8%E6%88%B7%E7%89%88%E6%9C%AC%7C%E5%85%8D%E8%B4%B9%E7%89%88%7C1521461468568; jac21581199=78751211; CNZZDATA4478442=cnzz_eid%3D878068609-1521456533-https%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1521461319; Hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; Hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471",
? ? "X-Forwarded-For" : "%s"
}
for i in range(0,500):
? ? choice = (
? ?? ???random.randint(1, 2),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ? )
? ? data["submitdata"] = data["submitdata"] % choice
? ? header["X-Forwarded-For"] = (str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+str(random.randint(1,255))
? ? r = requests.post(url = url,headers=header,data=data)
? ? print(header["X-Forwarded-For"],r.text)
? ? data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
? ? header["X-Forwarded-For"] = "%s"
效果圖:
關(guān)于這篇文章,因為之前寫(xiě)過(guò),不贅言,感興趣直接看:【如何通過(guò)Python實(shí)現手動(dòng)填寫(xiě)調查問(wèn)卷】
3.5 獲取網(wǎng)段代理IP,并判定是否能用、延遲時(shí)間
這一個(gè)事例中,我們想爬取【西刺代理】上的代理IP,并驗證這種代理的存活性以及延后時(shí)間。(你可以將爬取的代理IP添加進(jìn)proxychain中,然后進(jìn)行平時(shí)的滲透任務(wù)。)這里,我直接調用了linux的系統命令ping -c 1 " + ip.string + " | awk 'NR==2{print}' -,如果你想在Windows中運行這個(gè)程序,需要更改倒數第三行os.popen中的命令,改成Windows可以執行的即可。
from bs4 import BeautifulSoup
import requests
import os
url = "http://www.xicidaili.com/nn/1"
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
r = requests.get(url=url,headers=headers)
soup = BeautifulSoup(r.text,"lxml")
server_address = soup.select(".odd > td:nth-of-type(4)")
ip_list = soup.select(".odd > td:nth-of-type(2)")
ports = soup.select(".odd > td:nth-of-type(3)")
for server,ip in zip(server_address,ip_list):
? ? if len(server.contents) != 1:
? ?? ???print(server.a.string.ljust(8),ip.string.ljust(20), end='')
? ? else:
? ?? ???print("未知".ljust(8), ip.string.ljust(20), end='')
? ? delay_time = os.popen("ping -c 1 " + ip.string + " | awk 'NR==2{print}' -")
? ? delay_time = delay_time.read().split("time=")[-1].strip("\r\n")
? ? print("time = " + delay_time)
四、結語(yǔ)
當然,你還可以用python干好多有趣的事情。如果里面的那些反例你看的不是太懂,那我最后在送上一套python爬蟲(chóng)視頻教程:【Python網(wǎng)絡(luò )爬蟲(chóng)與信息提取】?,F在網(wǎng)路上的學(xué)習真的好多,希望你們就能好好借助。
有問(wèn)題你們可以留言哦,也歡迎你們到春秋峰會(huì )中來(lái)耍一耍>>>點(diǎn)擊跳轉 查看全部
i春秋詩(shī)人:Mochazz
一、前言
這篇文章之前是給新人培訓時(shí)用的,大家覺(jué)的很好理解的,所以就分享下來(lái),與你們一起學(xué)習。如果你學(xué)過(guò)一些python,想用它做些什么又沒(méi)有方向,不妨試試完成下邊幾個(gè)案例。
二、環(huán)境打算
安裝requests lxml beautifulsoup4三個(gè)庫(下面代碼均在python3.5環(huán)境下通過(guò)測試)
pip install requests lxml beautifulsoup4

三、幾個(gè)爬蟲(chóng)小案例3.1 獲取本機公網(wǎng)IP地址
利用公網(wǎng)上查詢(xún)IP的托詞,使用python的requests庫,自動(dòng)獲取IP地址。
import requests
r = requests.get("http://2017.ip138.com/ic.asp")
r.encoding = r.apparent_encoding? ?? ???#使用requests的字符編碼智能分析,避免中文亂碼
print(r.text)
# 你還可以使用正則匹配re模塊提取出IP
import re
print(re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",r.text))

3.2 利用百度搜索插口,編寫(xiě)url采集器
這個(gè)案例中,我們要使用requests結合BeautifulSoup庫來(lái)完成任務(wù)。我們要在程序中設置User-Agent頭,繞過(guò)百度搜索引擎的反爬蟲(chóng)機制(你可以試試不加User-Agent頭,看看能不能獲取到數據)。注意觀(guān)察百度搜索結構的URL鏈接規律,例如第一頁(yè)的url鏈接參數pn=0,第二頁(yè)的url鏈接參數pn=10…. 依次類(lèi)推。這里,我們使用css選擇器路徑提取數據。
import requests
from bs4 import BeautifulSoup
# 設置User-Agent頭,繞過(guò)百度搜索引擎的反爬蟲(chóng)機制
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'}
# 注意觀(guān)察百度搜索結構的URL鏈接規律,例如第一頁(yè)pn=0,第二頁(yè)pn=10.... 依次類(lèi)推,下面的for循環(huán)搜索前10頁(yè)結果
for i in range(0,100,10):
? ?? ???bd_search = "https://www.baidu.com/s%3Fwd%3 ... ot%3B % str(i)
? ?? ???r = requests.get(bd_search,headers=headers)
? ?? ???soup = BeautifulSoup(r.text,"lxml")
? ? # 下面的select使用了css選擇器路徑提取數據
? ?? ???url_list = soup.select(".t > a")
? ?? ???for url in url_list:
? ?? ?? ?? ?? ? real_url = url["href"]
? ?? ?? ?? ?? ? r = requests.get(real_url)
? ?? ?? ?? ?? ? print(r.url)
編寫(xiě)好程序后,我們使用關(guān)鍵詞inurl:/dede/login.php來(lái)批量提取織夢(mèng)cms的后臺地址,效果如下:

3.3 自動(dòng)下載搜狗壁紙
這個(gè)反例,我們將通過(guò)爬蟲(chóng)來(lái)手動(dòng)下載搜過(guò)墻紙,程序中儲存圖片的路徑改成你自己想要儲存圖片的目錄路徑即可。還有一點(diǎn),程序中我們用到了json庫,這是因為在觀(guān)察中,發(fā)現搜狗壁紙的地址是以json格式儲存,所以我們以json來(lái)解析這組數據。
import requests
import json
#下載圖片
url = "http://pic.sogou.com/pics/chan ... ot%3B
r = requests.get(url)
data = json.loads(r.text)
for i in data["all_items"]:
? ? img_url = i["pic_url"]
? ? # 下面這行里面的路徑改成你自己想要存放圖片的目錄路徑即可
? ? with open("/home/evilk0/Desktop/img/%s" % img_url[-10:]+".jpg","wb") as f:
? ?? ???r2 = requests.get(img_url)
? ?? ???f.write(r2.content)
? ? print("下載完畢:",img_url)

3.4 自動(dòng)填寫(xiě)調查問(wèn)卷
目標官網(wǎng):
目標問(wèn)卷:
import requests
import random
url = "https://www.wjx.cn/joinnew/pro ... ot%3B
data = {
? ? "submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
}
header = {
? ? "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)",
? ? "Cookie": ".ASPXANONYMOUS=iBuvxgz20wEkAAAAZGY4MDE1MjctNWU4Ni00MDUwLTgwYjQtMjFhMmZhMDE2MTA3h_bb3gNw4XRPsyh-qPh4XW1mfJ41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; UM_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100CBE37C329C8A3EEEEE289B573446F594297CC3BB3C355F09187F5ADCC492EBB07A9CC65CD43AD3E795C914CD57017EE3799E92F0E2762C963EF0912; WjxUser=UserName=17750277425&Type=1; LastCheckUpdateDate=1; LastCheckDesign=1; DeleteQCookie=1; _cnzz_CV4478442=%E7%94%A8%E6%88%B7%E7%89%88%E6%9C%AC%7C%E5%85%8D%E8%B4%B9%E7%89%88%7C1521461468568; jac21581199=78751211; CNZZDATA4478442=cnzz_eid%3D878068609-1521456533-https%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1521461319; Hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; Hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471",
}
for i in range(0,500):
? ? choice = (
? ?? ???random.randint(1, 2),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ? )
? ? data["submitdata"] = data["submitdata"] % choice
? ? r = requests.post(url = url,headers=header,data=data)
? ? print(r.text)
? ? data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
當我們使用同一個(gè)IP遞交多個(gè)問(wèn)卷時(shí),會(huì )觸發(fā)目標的反爬蟲(chóng)機制,服務(wù)器會(huì )出現驗證碼。


我們可以使用X-Forwarded-For來(lái)偽造我們的IP,修改后代碼如下:
import requests
import random
url = "https://www.wjx.cn/joinnew/pro ... ot%3B
data = {
? ? "submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
}
header = {
? ? "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)",
? ? "Cookie": ".ASPXANONYMOUS=iBuvxgz20wEkAAAAZGY4MDE1MjctNWU4Ni00MDUwLTgwYjQtMjFhMmZhMDE2MTA3h_bb3gNw4XRPsyh-qPh4XW1mfJ41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; UM_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100CBE37C329C8A3EEEEE289B573446F594297CC3BB3C355F09187F5ADCC492EBB07A9CC65CD43AD3E795C914CD57017EE3799E92F0E2762C963EF0912; WjxUser=UserName=17750277425&Type=1; LastCheckUpdateDate=1; LastCheckDesign=1; DeleteQCookie=1; _cnzz_CV4478442=%E7%94%A8%E6%88%B7%E7%89%88%E6%9C%AC%7C%E5%85%8D%E8%B4%B9%E7%89%88%7C1521461468568; jac21581199=78751211; CNZZDATA4478442=cnzz_eid%3D878068609-1521456533-https%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1521461319; Hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; Hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471",
? ? "X-Forwarded-For" : "%s"
}
for i in range(0,500):
? ? choice = (
? ?? ???random.randint(1, 2),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ? )
? ? data["submitdata"] = data["submitdata"] % choice
? ? header["X-Forwarded-For"] = (str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+str(random.randint(1,255))
? ? r = requests.post(url = url,headers=header,data=data)
? ? print(header["X-Forwarded-For"],r.text)
? ? data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
? ? header["X-Forwarded-For"] = "%s"
效果圖:



關(guān)于這篇文章,因為之前寫(xiě)過(guò),不贅言,感興趣直接看:【如何通過(guò)Python實(shí)現手動(dòng)填寫(xiě)調查問(wèn)卷】
3.5 獲取網(wǎng)段代理IP,并判定是否能用、延遲時(shí)間
這一個(gè)事例中,我們想爬取【西刺代理】上的代理IP,并驗證這種代理的存活性以及延后時(shí)間。(你可以將爬取的代理IP添加進(jìn)proxychain中,然后進(jìn)行平時(shí)的滲透任務(wù)。)這里,我直接調用了linux的系統命令ping -c 1 " + ip.string + " | awk 'NR==2{print}' -,如果你想在Windows中運行這個(gè)程序,需要更改倒數第三行os.popen中的命令,改成Windows可以執行的即可。
from bs4 import BeautifulSoup
import requests
import os
url = "http://www.xicidaili.com/nn/1"
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
r = requests.get(url=url,headers=headers)
soup = BeautifulSoup(r.text,"lxml")
server_address = soup.select(".odd > td:nth-of-type(4)")
ip_list = soup.select(".odd > td:nth-of-type(2)")
ports = soup.select(".odd > td:nth-of-type(3)")
for server,ip in zip(server_address,ip_list):
? ? if len(server.contents) != 1:
? ?? ???print(server.a.string.ljust(8),ip.string.ljust(20), end='')
? ? else:
? ?? ???print("未知".ljust(8), ip.string.ljust(20), end='')
? ? delay_time = os.popen("ping -c 1 " + ip.string + " | awk 'NR==2{print}' -")
? ? delay_time = delay_time.read().split("time=")[-1].strip("\r\n")
? ? print("time = " + delay_time)


四、結語(yǔ)
當然,你還可以用python干好多有趣的事情。如果里面的那些反例你看的不是太懂,那我最后在送上一套python爬蟲(chóng)視頻教程:【Python網(wǎng)絡(luò )爬蟲(chóng)與信息提取】?,F在網(wǎng)路上的學(xué)習真的好多,希望你們就能好好借助。
有問(wèn)題你們可以留言哦,也歡迎你們到春秋峰會(huì )中來(lái)耍一耍>>>點(diǎn)擊跳轉
假如你早已開(kāi)始學(xué)python,對爬蟲(chóng)沒(méi)有頭緒,不妨瞧瞧這幾個(gè)案例!
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 239 次瀏覽 ? 2020-08-13 14:23
一、論述
這幾個(gè)案例曾經(jīng)是給一些想步入Python行業(yè)的同事寫(xiě)的,看到你們都比較滿(mǎn)意,所以就再度拿了下來(lái),如果你早已開(kāi)始學(xué)python,對爬蟲(chóng)沒(méi)有頭緒,不妨瞧瞧這幾個(gè)案例,文末更多分享!
二、環(huán)境打算
Python 3
requests庫 、lxml庫、beautifulsoup4庫
pip install XX XX XX一并安裝。
在這里相信有許多想要學(xué)習Python的朋友,大家可以+下Python學(xué)習分享褲:叁零肆+零伍零+柒玖玖,即可免費發(fā)放一整套系統的 Python學(xué)習教程
三、Python爬蟲(chóng)小案例
1、獲取本機的公網(wǎng)IP地址
利用python的requests庫+公網(wǎng)上查IP的插口,自動(dòng)獲取IP地址
2、利用百度的查找插口,Python編撰url采集工具
需要用到requests庫、BeautifulSoup庫,觀(guān)察百度搜索結構的URL鏈接規律,繞過(guò)百度搜索引擎的反爬蟲(chóng)機制的方式為在程序中設置User-Agent懇求頭。
Python源代碼:
Python語(yǔ)言編撰好程序后,利用關(guān)鍵詞inurl:/dede/login.php 來(lái)批量提取某網(wǎng)cms的后臺地址:
3、利用Python構建搜狗壁紙手動(dòng)下載爬蟲(chóng)
搜狗壁紙的地址是json格式,所以用json庫解析這組數據,爬蟲(chóng)程序儲存圖片的c盤(pán)路徑改成欲存圖片的路徑就可以了。
效果圖:
4、Python手動(dòng)填寫(xiě)問(wèn)卷調查
與通常網(wǎng)頁(yè)一樣,多次遞交數據會(huì )要輸入驗證碼,這就是反爬機制。
如圖:
那么怎么繞開(kāi)驗證碼的反爬舉措?利用X-Forwarded-For偽造IP地址訪(fǎng)問(wèn)即可,Python代碼如下:
效果:
5、獲取南刺代理上的IP,驗證這種代理被封禁掉的可能性與延后時(shí)間
可以把Python爬取的代理IP添加到proxychain上面,就可以進(jìn)行通常的滲透任務(wù)了。這里直接調用了linux的系統命令ping -c 1 " + ip.string + " | awk 'NR==2{print}' - ,在Windows中運行此程序須要更改倒數第三行os.popen里的命令,修改為Windows才能執行的就可以了。
爬取到的數據如圖:
演示:
結論
其實(shí)我們能否用python做許多特別有趣的事。假如說(shuō)里面的爬蟲(chóng)小案例無(wú)法夠完全理解,那我最后再送上一套python爬蟲(chóng)手把手系列的視頻教程,私信小編007即可手動(dòng)獲取。 查看全部
一、論述
這幾個(gè)案例曾經(jīng)是給一些想步入Python行業(yè)的同事寫(xiě)的,看到你們都比較滿(mǎn)意,所以就再度拿了下來(lái),如果你早已開(kāi)始學(xué)python,對爬蟲(chóng)沒(méi)有頭緒,不妨瞧瞧這幾個(gè)案例,文末更多分享!
二、環(huán)境打算
Python 3
requests庫 、lxml庫、beautifulsoup4庫
pip install XX XX XX一并安裝。
在這里相信有許多想要學(xué)習Python的朋友,大家可以+下Python學(xué)習分享褲:叁零肆+零伍零+柒玖玖,即可免費發(fā)放一整套系統的 Python學(xué)習教程
三、Python爬蟲(chóng)小案例
1、獲取本機的公網(wǎng)IP地址
利用python的requests庫+公網(wǎng)上查IP的插口,自動(dòng)獲取IP地址
2、利用百度的查找插口,Python編撰url采集工具
需要用到requests庫、BeautifulSoup庫,觀(guān)察百度搜索結構的URL鏈接規律,繞過(guò)百度搜索引擎的反爬蟲(chóng)機制的方式為在程序中設置User-Agent懇求頭。
Python源代碼:
Python語(yǔ)言編撰好程序后,利用關(guān)鍵詞inurl:/dede/login.php 來(lái)批量提取某網(wǎng)cms的后臺地址:
3、利用Python構建搜狗壁紙手動(dòng)下載爬蟲(chóng)
搜狗壁紙的地址是json格式,所以用json庫解析這組數據,爬蟲(chóng)程序儲存圖片的c盤(pán)路徑改成欲存圖片的路徑就可以了。
效果圖:
4、Python手動(dòng)填寫(xiě)問(wèn)卷調查
與通常網(wǎng)頁(yè)一樣,多次遞交數據會(huì )要輸入驗證碼,這就是反爬機制。
如圖:
那么怎么繞開(kāi)驗證碼的反爬舉措?利用X-Forwarded-For偽造IP地址訪(fǎng)問(wèn)即可,Python代碼如下:
效果:
5、獲取南刺代理上的IP,驗證這種代理被封禁掉的可能性與延后時(shí)間
可以把Python爬取的代理IP添加到proxychain上面,就可以進(jìn)行通常的滲透任務(wù)了。這里直接調用了linux的系統命令ping -c 1 " + ip.string + " | awk 'NR==2{print}' - ,在Windows中運行此程序須要更改倒數第三行os.popen里的命令,修改為Windows才能執行的就可以了。
爬取到的數據如圖:
演示:
結論
其實(shí)我們能否用python做許多特別有趣的事。假如說(shuō)里面的爬蟲(chóng)小案例無(wú)法夠完全理解,那我最后再送上一套python爬蟲(chóng)手把手系列的視頻教程,私信小編007即可手動(dòng)獲取。
紅包搞笑html網(wǎng)頁(yè)源碼與織夢(mèng)智能采集俠下載評論軟件詳情對比
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 352 次瀏覽 ? 2020-08-10 01:56
織夢(mèng)智能采集俠功能
1、一鍵安裝,全手動(dòng)采集
織夢(mèng)采集俠安裝非常簡(jiǎn)單便捷,只需一分鐘,立即開(kāi)始采集,而且結合簡(jiǎn)單、健壯、靈活、開(kāi)源的dedecms程序,新手也能快速上手,而且我們還有專(zhuān)門(mén)的客服為商業(yè)顧客提供技術(shù)支持。
2、一詞采集,無(wú)須編撰采集規則
和傳統的采集模式不同的是織夢(mèng)采集俠可以依據用戶(hù)設定的關(guān)鍵詞進(jìn)行泛采集,泛采集的優(yōu)勢在于通過(guò)采集該關(guān)鍵詞的不同搜索結果,實(shí)現不對指定的一個(gè)或幾個(gè)被采集站點(diǎn)進(jìn)行采集,減少采集站點(diǎn)被搜索引擎判斷為鏡像站點(diǎn)被搜索引擎懲罰的危險。
3、RSS采集,輸入RSS地址即可采集內容
只要被采集的網(wǎng)站提供RSS訂閱地址,即可通過(guò)RSS進(jìn)行采集,只須要輸入RSS地址即可便捷的 采集到目標網(wǎng)站內容,無(wú)需編撰采集規則,方便簡(jiǎn)單。
4、定向采集,精確采集標題、正文、作者、來(lái)源
定向采集只須要提供列表URL和文章URL即可智能采集指定網(wǎng)站或欄目?jì)热?,方便?jiǎn)單,編寫(xiě)簡(jiǎn)單規則便可精確采集標題、正文、作者、來(lái)源。
5、 多種偽原創(chuàng )及優(yōu)化方法,提高收錄率及排行
自動(dòng)標題、段落重排、高級混淆、自動(dòng)內鏈、內容過(guò)濾、網(wǎng)址過(guò)濾、同義詞替換、插入seo成語(yǔ)、關(guān)鍵詞添加鏈接等多種方式手段對采集回來(lái)的文章加工處理,增強采集文章原創(chuàng )性,利于搜索引擎優(yōu)化,提高搜索引擎收錄、網(wǎng)站權重及關(guān)鍵詞排行。
6、插件全手動(dòng)采集,無(wú)需人工干預
織夢(mèng)采集俠根據預先設定是采集任務(wù),根據所設定的采集方式采集網(wǎng)址,然后手動(dòng)抓取網(wǎng)頁(yè)內容,程序通過(guò)精確估算剖析網(wǎng)頁(yè),丟棄掉不是文章內容頁(yè)的網(wǎng)址,提取出優(yōu)秀文章內容,最后進(jìn)行偽原創(chuàng ),導入,生成,這一切操作程序都是全手動(dòng)完成,無(wú)需人工干預。
7、手工發(fā)布文章亦可偽原創(chuàng )和搜索優(yōu)化處理
織夢(mèng)采集俠并不僅僅是一款采集插件,更是一款織夢(mèng)必備偽原創(chuàng )及搜索優(yōu)化插件,手工發(fā)布的文章可以經(jīng)過(guò)織夢(mèng)采集俠的偽原創(chuàng )和搜索優(yōu)化處理,可以對文章進(jìn)行同義詞替換,自動(dòng)內鏈,隨機插入關(guān)鍵詞鏈接和文章內收錄關(guān)鍵詞將手動(dòng)添加指定鏈接等功能,是一款織夢(mèng)必備插件。
8、定時(shí)定量進(jìn)行采集偽原創(chuàng )SEO更新
插件有兩個(gè)觸發(fā)采集方式,一種是在頁(yè)面內添加代碼由用戶(hù)訪(fǎng)問(wèn)觸發(fā)采集更新,另外種我們?yōu)樯虡I(yè)用戶(hù)提供的遠程觸發(fā)采集服務(wù),新站無(wú)有人訪(fǎng)問(wèn)即可定時(shí)定量采集更新,無(wú)需人工干預。
9、定時(shí)定量更新待初審文稿
縱使你數據庫上面有成千上萬(wàn)篇文章,織夢(mèng)采集俠亦可按照您的須要每晚在您設置的時(shí)間段內定時(shí)定量初審更新。
10、綁定織夢(mèng)采集節點(diǎn),定時(shí)采集偽原創(chuàng )SEO更新
綁定織夢(mèng)采集節點(diǎn)的功能,讓織夢(mèng)CMS自帶的采集功能也能定時(shí)手動(dòng)采集更新。方便早已設置了采集規則的用戶(hù)定時(shí)采集更新。
織夢(mèng)智能采集俠破解說(shuō)明
織夢(mèng)采集俠采集版分UTF8和GBK兩個(gè)版本,根據自己使用的dedecms版本來(lái)選擇!
因文件是用mac系統打包的,會(huì )自帶_MACOSX、.DS_Store文件,不影響使用,有強迫癥的可以刪掉。覆蓋破解文件的時(shí)侯不用管這種文件。
1,【您自行去采集俠官方下載最新v2.8版本(網(wǎng)址: 如果官網(wǎng)不能打開(kāi)就用我備份好的,解壓后有個(gè)采集俠官方插件文件夾,自行選擇安裝對應的版本),然后安裝到您的織夢(mèng)后臺,如果之前安裝過(guò)2.7版本,請先刪掉!】
2,注意安裝的時(shí)侯版本千萬(wàn)不要選錯了,UTF8就裝UTF8,GBK就用GBK的不要混用!
3,【覆蓋破解文件】(共三個(gè)文件CaiJiXia、include和Plugins)
Plugins : 直接覆蓋到網(wǎng)站的根目錄
include : 直接覆蓋到網(wǎng)站的根目錄
CaiJiXia: 網(wǎng)站默認后臺是dede,如果你沒(méi)有更改后臺目錄的話(huà)那就是覆蓋 /dede/apps/下面,如果后臺訪(fǎng)問(wèn)路徑被更改過(guò)的話(huà),那就把dede換成你更改的名稱(chēng)。例:dede已更改成test, 那就覆蓋/test/apps/目錄下
4,【破解程序使用對域名無(wú)限制】
5, 【覆蓋后須要清除下瀏覽器緩存, 推薦使用微軟或則火狐瀏覽器,不要用IE內核瀏覽器,清理緩存有時(shí)清的不干凈】
6, PHP版本必須5.3+
織夢(mèng)智能采集俠使用方式
1、設置定向采集
1)、登錄您網(wǎng)站后臺,模塊->采集俠->采集任務(wù),如果您的網(wǎng)站還沒(méi)有添加欄目,你須要先到織夢(mèng)的欄目管理里先添加欄目,如果早已添加了欄目,你可能可以看見(jiàn)如下界面
2)、在彈出的頁(yè)面里選擇定向采集,如圖所示
3)、點(diǎn)擊添加采集規則
2、設置 目標頁(yè)面編碼
打開(kāi)您要采集的網(wǎng)頁(yè),點(diǎn)擊滑鼠右鍵,點(diǎn)擊查看網(wǎng)站源碼,搜索charset,查看charset前面緊隨的是utf-8還是gb2312
3、設置 列表網(wǎng)址
列表網(wǎng)址就是您要采集的網(wǎng)站的欄目列表地址
如果只是單純采集列表頁(yè)的第一頁(yè),直接輸入該列表URL就行,如我要采集站長(cháng)之家的優(yōu)化欄目的第一頁(yè),那列表URL就輸入:,即可。采集第一頁(yè)的內容的益處就是可以不用采集老舊的新聞,而且有新更新也可以及時(shí)采集到,如果須要采集該欄目的所有內容,那也可以通過(guò)設置鍵值的方法,匹配所有列表URL規則。
織夢(mèng)智能采集俠常見(jiàn)問(wèn)題
綁定x個(gè)域名授權是哪些意思呢?
多少個(gè)域名授權,就是多少個(gè)網(wǎng)站可以使用織夢(mèng)采集俠商業(yè)版。
插件可以指定網(wǎng)站進(jìn)行采集嗎?
插件不僅可以按照關(guān)鍵詞采集外,還有RSS和頁(yè)面監控采集這兩種采集方式,可以指定網(wǎng)站進(jìn)行采集。
如果我的域名不想用了,可以更換域名授權嗎?
可以給您更換域名授權,每更換1域名授權僅需10元手續費。
根據關(guān)鍵詞采集回來(lái)的內容是來(lái)自什么網(wǎng)站?
根據關(guān)鍵詞采集是用您設置的關(guān)鍵詞通過(guò)搜索引擎進(jìn)行搜索,采集搜索下來(lái)的結果,來(lái)自不同的網(wǎng)站。 查看全部
織夢(mèng)采集俠是一款站長(cháng)們必備的織夢(mèng)網(wǎng)站后臺手動(dòng)采集軟件,該軟件可以幫助用戶(hù)快速的將網(wǎng)站數據采集和添加,是每一個(gè)織夢(mèng)dede網(wǎng)站必不可少的網(wǎng)站插件工具,能夠進(jìn)行文章的手動(dòng)采集,織夢(mèng)智能采集俠同時(shí)擁有無(wú)限制的域名使用療效,讓你不受次數限制,歡迎有需求的用戶(hù)們前來(lái)下載使用。
織夢(mèng)智能采集俠功能
1、一鍵安裝,全手動(dòng)采集
織夢(mèng)采集俠安裝非常簡(jiǎn)單便捷,只需一分鐘,立即開(kāi)始采集,而且結合簡(jiǎn)單、健壯、靈活、開(kāi)源的dedecms程序,新手也能快速上手,而且我們還有專(zhuān)門(mén)的客服為商業(yè)顧客提供技術(shù)支持。
2、一詞采集,無(wú)須編撰采集規則
和傳統的采集模式不同的是織夢(mèng)采集俠可以依據用戶(hù)設定的關(guān)鍵詞進(jìn)行泛采集,泛采集的優(yōu)勢在于通過(guò)采集該關(guān)鍵詞的不同搜索結果,實(shí)現不對指定的一個(gè)或幾個(gè)被采集站點(diǎn)進(jìn)行采集,減少采集站點(diǎn)被搜索引擎判斷為鏡像站點(diǎn)被搜索引擎懲罰的危險。
3、RSS采集,輸入RSS地址即可采集內容
只要被采集的網(wǎng)站提供RSS訂閱地址,即可通過(guò)RSS進(jìn)行采集,只須要輸入RSS地址即可便捷的 采集到目標網(wǎng)站內容,無(wú)需編撰采集規則,方便簡(jiǎn)單。
4、定向采集,精確采集標題、正文、作者、來(lái)源
定向采集只須要提供列表URL和文章URL即可智能采集指定網(wǎng)站或欄目?jì)热?,方便?jiǎn)單,編寫(xiě)簡(jiǎn)單規則便可精確采集標題、正文、作者、來(lái)源。
5、 多種偽原創(chuàng )及優(yōu)化方法,提高收錄率及排行
自動(dòng)標題、段落重排、高級混淆、自動(dòng)內鏈、內容過(guò)濾、網(wǎng)址過(guò)濾、同義詞替換、插入seo成語(yǔ)、關(guān)鍵詞添加鏈接等多種方式手段對采集回來(lái)的文章加工處理,增強采集文章原創(chuàng )性,利于搜索引擎優(yōu)化,提高搜索引擎收錄、網(wǎng)站權重及關(guān)鍵詞排行。
6、插件全手動(dòng)采集,無(wú)需人工干預
織夢(mèng)采集俠根據預先設定是采集任務(wù),根據所設定的采集方式采集網(wǎng)址,然后手動(dòng)抓取網(wǎng)頁(yè)內容,程序通過(guò)精確估算剖析網(wǎng)頁(yè),丟棄掉不是文章內容頁(yè)的網(wǎng)址,提取出優(yōu)秀文章內容,最后進(jìn)行偽原創(chuàng ),導入,生成,這一切操作程序都是全手動(dòng)完成,無(wú)需人工干預。
7、手工發(fā)布文章亦可偽原創(chuàng )和搜索優(yōu)化處理
織夢(mèng)采集俠并不僅僅是一款采集插件,更是一款織夢(mèng)必備偽原創(chuàng )及搜索優(yōu)化插件,手工發(fā)布的文章可以經(jīng)過(guò)織夢(mèng)采集俠的偽原創(chuàng )和搜索優(yōu)化處理,可以對文章進(jìn)行同義詞替換,自動(dòng)內鏈,隨機插入關(guān)鍵詞鏈接和文章內收錄關(guān)鍵詞將手動(dòng)添加指定鏈接等功能,是一款織夢(mèng)必備插件。
8、定時(shí)定量進(jìn)行采集偽原創(chuàng )SEO更新
插件有兩個(gè)觸發(fā)采集方式,一種是在頁(yè)面內添加代碼由用戶(hù)訪(fǎng)問(wèn)觸發(fā)采集更新,另外種我們?yōu)樯虡I(yè)用戶(hù)提供的遠程觸發(fā)采集服務(wù),新站無(wú)有人訪(fǎng)問(wèn)即可定時(shí)定量采集更新,無(wú)需人工干預。
9、定時(shí)定量更新待初審文稿
縱使你數據庫上面有成千上萬(wàn)篇文章,織夢(mèng)采集俠亦可按照您的須要每晚在您設置的時(shí)間段內定時(shí)定量初審更新。
10、綁定織夢(mèng)采集節點(diǎn),定時(shí)采集偽原創(chuàng )SEO更新
綁定織夢(mèng)采集節點(diǎn)的功能,讓織夢(mèng)CMS自帶的采集功能也能定時(shí)手動(dòng)采集更新。方便早已設置了采集規則的用戶(hù)定時(shí)采集更新。
織夢(mèng)智能采集俠破解說(shuō)明
織夢(mèng)采集俠采集版分UTF8和GBK兩個(gè)版本,根據自己使用的dedecms版本來(lái)選擇!
因文件是用mac系統打包的,會(huì )自帶_MACOSX、.DS_Store文件,不影響使用,有強迫癥的可以刪掉。覆蓋破解文件的時(shí)侯不用管這種文件。
1,【您自行去采集俠官方下載最新v2.8版本(網(wǎng)址: 如果官網(wǎng)不能打開(kāi)就用我備份好的,解壓后有個(gè)采集俠官方插件文件夾,自行選擇安裝對應的版本),然后安裝到您的織夢(mèng)后臺,如果之前安裝過(guò)2.7版本,請先刪掉!】
2,注意安裝的時(shí)侯版本千萬(wàn)不要選錯了,UTF8就裝UTF8,GBK就用GBK的不要混用!
3,【覆蓋破解文件】(共三個(gè)文件CaiJiXia、include和Plugins)
Plugins : 直接覆蓋到網(wǎng)站的根目錄
include : 直接覆蓋到網(wǎng)站的根目錄
CaiJiXia: 網(wǎng)站默認后臺是dede,如果你沒(méi)有更改后臺目錄的話(huà)那就是覆蓋 /dede/apps/下面,如果后臺訪(fǎng)問(wèn)路徑被更改過(guò)的話(huà),那就把dede換成你更改的名稱(chēng)。例:dede已更改成test, 那就覆蓋/test/apps/目錄下
4,【破解程序使用對域名無(wú)限制】
5, 【覆蓋后須要清除下瀏覽器緩存, 推薦使用微軟或則火狐瀏覽器,不要用IE內核瀏覽器,清理緩存有時(shí)清的不干凈】
6, PHP版本必須5.3+
織夢(mèng)智能采集俠使用方式
1、設置定向采集
1)、登錄您網(wǎng)站后臺,模塊->采集俠->采集任務(wù),如果您的網(wǎng)站還沒(méi)有添加欄目,你須要先到織夢(mèng)的欄目管理里先添加欄目,如果早已添加了欄目,你可能可以看見(jiàn)如下界面
2)、在彈出的頁(yè)面里選擇定向采集,如圖所示
3)、點(diǎn)擊添加采集規則
2、設置 目標頁(yè)面編碼
打開(kāi)您要采集的網(wǎng)頁(yè),點(diǎn)擊滑鼠右鍵,點(diǎn)擊查看網(wǎng)站源碼,搜索charset,查看charset前面緊隨的是utf-8還是gb2312
3、設置 列表網(wǎng)址
列表網(wǎng)址就是您要采集的網(wǎng)站的欄目列表地址
如果只是單純采集列表頁(yè)的第一頁(yè),直接輸入該列表URL就行,如我要采集站長(cháng)之家的優(yōu)化欄目的第一頁(yè),那列表URL就輸入:,即可。采集第一頁(yè)的內容的益處就是可以不用采集老舊的新聞,而且有新更新也可以及時(shí)采集到,如果須要采集該欄目的所有內容,那也可以通過(guò)設置鍵值的方法,匹配所有列表URL規則。
織夢(mèng)智能采集俠常見(jiàn)問(wèn)題
綁定x個(gè)域名授權是哪些意思呢?
多少個(gè)域名授權,就是多少個(gè)網(wǎng)站可以使用織夢(mèng)采集俠商業(yè)版。
插件可以指定網(wǎng)站進(jìn)行采集嗎?
插件不僅可以按照關(guān)鍵詞采集外,還有RSS和頁(yè)面監控采集這兩種采集方式,可以指定網(wǎng)站進(jìn)行采集。
如果我的域名不想用了,可以更換域名授權嗎?
可以給您更換域名授權,每更換1域名授權僅需10元手續費。
根據關(guān)鍵詞采集回來(lái)的內容是來(lái)自什么網(wǎng)站?
根據關(guān)鍵詞采集是用您設置的關(guān)鍵詞通過(guò)搜索引擎進(jìn)行搜索,采集搜索下來(lái)的結果,來(lái)自不同的網(wǎng)站。
Python3+Selenium2完整的自動(dòng)化測試實(shí)現之旅(六):Python單
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 221 次瀏覽 ? 2020-08-09 23:04
Unitest是Python下的一個(gè)單元測試模塊,是Python標準庫模塊之一,安裝完P(guān)ython后就可以直接import該模塊,能在單元測試下編撰具體的測試用例腳本,并調用模塊封裝好的方式,實(shí)現測試用例的執行、測試場(chǎng)景的恢復,甚至能批量采集測試用例腳本、批量運行測試腳本用例、控制執行次序等,依托于Unittest模塊,可以高效的組織測試用例編撰、測試用例腳本的采集管理以及腳本運行的執行控制等。Unitest單元測試框架主要收錄如下幾個(gè)重要的邏輯單元:
1.測試固件(test fixture)
一個(gè)測試固件包括兩部份,執行測試代碼的后置條件和測試結束以后的場(chǎng)景恢復,這兩部份通常用函數setUp()和tearDown()表示。簡(jiǎn)單說(shuō),就是平常手工測試一條具體的測試用例時(shí),測試的后置環(huán)境和測試結束后的環(huán)境恢復。
2.測試用例(test case)
unittest中管理的最小單元是測試用例,就是一個(gè)測試用例,包括具體測試業(yè)務(wù)的函數或則方式,只是該test case 必須是以test開(kāi)頭的函數。unittest會(huì )自動(dòng)化辨識test開(kāi)頭的函數是測試代碼,如果你寫(xiě)的函數不是test開(kāi)頭,unittest是不會(huì )執行這個(gè)函數上面的腳本,這個(gè)千萬(wàn)要記住,所有的測試函數都要test開(kāi)頭,記住是大寫(xiě)的哦。
3.測試套件 (test suite)
就是好多測試用例的集合,一個(gè)測試套件可以隨便管理多個(gè)測試用例,該部份拿來(lái)實(shí)現眾多測試用例的采集,形成一套測試用例集。
4.測試執行器 (test runner)
test runner是一個(gè)拿來(lái)執行加載測試用例,并執行用例,且提供測試輸出的一個(gè)邏輯單元。test runner可以加載test case或則test suite進(jìn)行執行測試任務(wù),并能控制用例集的執行次序等。
從Unitest單元測試框架的基本邏輯單元設計來(lái)看,很明顯可以看見(jiàn)它收錄了用例的整個(gè)生命周期:用例的后置條件、用例的編撰、用例的采集、用例的執行以及測試執行后的場(chǎng)景恢復。
二、首次使用Unittest模塊
下面以打開(kāi)百度,進(jìn)行搜索,創(chuàng )建一個(gè)名為baidu_search.py的腳本文件,編寫(xiě)百度搜索分別python2和python3的測試用例,代碼如下:
'''
Code description:
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
import time
import unittest
from selenium import webdriver
class Search(unittest.TestCase):
def setUp(self):
"""
測試前置條件,這里要搜索的話(huà)就是先得打開(kāi)百度網(wǎng)站啦
"""
self.driver = webdriver.Ie()
self.driver.maximize_window()
self.driver.implicitly_wait(5)
self.driver.get("https://www.baidu.com")
def tearDown():
"""
測試結束后環(huán)境復原,這里就是瀏覽器關(guān)閉退出
"""
self.driver.quit()
def test_search1(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python2')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python2' in self.driver.title
print('檢索python2完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search2(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python3')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python3' in self.driver.title
print('檢索python3完成')
except Exception as e:
print('檢索失敗', format(e))
if __name__ == '__main__':
unittest.main()
在PyCharm中運行里面代碼,我們會(huì )發(fā)覺(jué)瀏覽器打開(kāi)關(guān)掉了兩次,分別檢索了python2關(guān)掉瀏覽器,然后檢索python3關(guān)掉瀏覽器。
這個(gè)療效其實(shí)不是我們希望的,我們希望檢索完python2后,不用關(guān)掉瀏覽器繼續檢索python3,Unittest有相關(guān)的設置嗎?答案是肯定的,我們對以上代碼做下調整更改,注意對比不同的地方,然后運行就達到我們想要的療效
'''
Code description:
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
import time
import unittest
from selenium import webdriver
class Search(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""
測試前置條件,這里要搜索的話(huà)就是先得打開(kāi)百度網(wǎng)站啦
"""
cls.driver = webdriver.Ie()
cls.driver.maximize_window()
cls.driver.implicitly_wait(5)
cls.driver.get("https://www.baidu.com")
@classmethod
def tearDownClass(cls):
"""
測試結束后環(huán)境復原,這里就是瀏覽器關(guān)閉退出
"""
cls.driver.quit()
def test_search1(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python2')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python2' in self.driver.title
print('檢索python2完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search2(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').clear() # 清空之前輸入的python2
self.driver.find_element_by_id('kw').send_keys('python3')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python3' in self.driver.title
print('檢索python3完成')
except Exception as e:
print('檢索失敗', format(e))
if __name__ == '__main__':
unittest.main()
三、Unittest模塊批量加載和管理用例
以上對于Unittest框架,我們似乎只用到了測試固件、測試用例兩個(gè)邏輯單元的使用,接下來(lái)問(wèn)題又來(lái)了:我們日常項目中的測試案例肯定不止一個(gè),當案例越來(lái)越多時(shí)我們怎樣管理那些批量案例?如何保證案例不重復?如果案例特別多(成百上千,甚至更多)時(shí)怎么保證案例執行的效率?
來(lái)看一下在unittest框架中怎樣管理批量用例:
手動(dòng)添加采集指定的測試用例集用法:先在PyCharm中新建如下項目層級:
其中baidu_search1還是里面調整更改過(guò)的代碼,然后編輯run_case.py文件,代碼如下:
'''
Code description: 執行add 的測試用例集
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
from testcase.sreach.baidu_sreach1 import Search # 將baidu_sreach.py模塊導入進(jìn)來(lái)
import unittest
suite = unittest.TestSuite() # 構造測試用例集
# suite.addTest(Search("test_search1"))
suite.addTest(Search("test_search2")) # 分別添加baidu_sreach1.py中的兩個(gè)檢索的測試用例
if __name__ == '__main__':
runner = unittest.TextTestRunner() # 實(shí)例化runner
runner.run(suite) #執行測試
這樣運行run_case.py,就只執行了在百度中搜索python3這條用例,手動(dòng)添加指定用例到測試套件的方式是addTest(),但是好多時(shí)侯我們寫(xiě)了好多測試腳本文件,每個(gè)腳本中有多個(gè)test,,如果還是使用addTest()方法就不行了,我們希望能獲取所有的測試集,并全部執行。然后編輯run_all_case.py文件,編寫(xiě)如下代碼:
'''
Code description: TestLoader所有測試case
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
import time
import os.path
import unittest
from selenium import webdriver
class Search(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""
測試前置條件,這里要搜索的話(huà)就是先得打開(kāi)百度網(wǎng)站啦
"""
cls.driver = webdriver.Ie()
cls.driver.maximize_window()
cls.driver.implicitly_wait(5)
cls.driver.get("https://www.baidu.com")
@classmethod
def tearDownClass(cls):
"""
測試結束后環(huán)境復原,這里就是瀏覽器關(guān)閉退出
"""
cls.driver.quit()
def test_search1(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python2')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python2' in self.driver.title
print('檢索python2完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search2(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').clear() # 清空之前輸入的python2
self.driver.find_element_by_id('kw').send_keys('python3')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python3' in self.driver.title
print('檢索python3完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search3(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').clear() # 清空之前輸入的python3
self.driver.find_element_by_id('kw').send_keys('hello world')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'hello world' in self.driver.title
print('檢索hello world完成')
except Exception as e:
print('檢索失敗', format(e))
case_path = os.path.join(os.getcwd()) # 在當前目錄中采集測試用例
print(case_path)
all_case = unittest.defaultTestLoader.discover(case_path, pattern="test*.py", top_level_dir=None) # 采集所有test開(kāi)頭的測試用例
print(all_case)
if __name__ == '__main__':
runner = unittest.TextTestRunner() # 實(shí)例化runner
runner.run(all_case) # 執行測試
獲取所有的測試用例集使用的是discover()方法,在PyCharm中運行該腳本就如下:
以上就完成了在Python Unittest單元測試框架下編撰測試用例腳本,并使用其提供的多種方式來(lái)批量管理測試用例集并并執行。
轉載于: 查看全部
一、Unittest單元測試框架簡(jiǎn)介
Unitest是Python下的一個(gè)單元測試模塊,是Python標準庫模塊之一,安裝完P(guān)ython后就可以直接import該模塊,能在單元測試下編撰具體的測試用例腳本,并調用模塊封裝好的方式,實(shí)現測試用例的執行、測試場(chǎng)景的恢復,甚至能批量采集測試用例腳本、批量運行測試腳本用例、控制執行次序等,依托于Unittest模塊,可以高效的組織測試用例編撰、測試用例腳本的采集管理以及腳本運行的執行控制等。Unitest單元測試框架主要收錄如下幾個(gè)重要的邏輯單元:
1.測試固件(test fixture)
一個(gè)測試固件包括兩部份,執行測試代碼的后置條件和測試結束以后的場(chǎng)景恢復,這兩部份通常用函數setUp()和tearDown()表示。簡(jiǎn)單說(shuō),就是平常手工測試一條具體的測試用例時(shí),測試的后置環(huán)境和測試結束后的環(huán)境恢復。
2.測試用例(test case)
unittest中管理的最小單元是測試用例,就是一個(gè)測試用例,包括具體測試業(yè)務(wù)的函數或則方式,只是該test case 必須是以test開(kāi)頭的函數。unittest會(huì )自動(dòng)化辨識test開(kāi)頭的函數是測試代碼,如果你寫(xiě)的函數不是test開(kāi)頭,unittest是不會(huì )執行這個(gè)函數上面的腳本,這個(gè)千萬(wàn)要記住,所有的測試函數都要test開(kāi)頭,記住是大寫(xiě)的哦。
3.測試套件 (test suite)
就是好多測試用例的集合,一個(gè)測試套件可以隨便管理多個(gè)測試用例,該部份拿來(lái)實(shí)現眾多測試用例的采集,形成一套測試用例集。
4.測試執行器 (test runner)
test runner是一個(gè)拿來(lái)執行加載測試用例,并執行用例,且提供測試輸出的一個(gè)邏輯單元。test runner可以加載test case或則test suite進(jìn)行執行測試任務(wù),并能控制用例集的執行次序等。
從Unitest單元測試框架的基本邏輯單元設計來(lái)看,很明顯可以看見(jiàn)它收錄了用例的整個(gè)生命周期:用例的后置條件、用例的編撰、用例的采集、用例的執行以及測試執行后的場(chǎng)景恢復。
二、首次使用Unittest模塊
下面以打開(kāi)百度,進(jìn)行搜索,創(chuàng )建一個(gè)名為baidu_search.py的腳本文件,編寫(xiě)百度搜索分別python2和python3的測試用例,代碼如下:
'''
Code description:
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
import time
import unittest
from selenium import webdriver
class Search(unittest.TestCase):
def setUp(self):
"""
測試前置條件,這里要搜索的話(huà)就是先得打開(kāi)百度網(wǎng)站啦
"""
self.driver = webdriver.Ie()
self.driver.maximize_window()
self.driver.implicitly_wait(5)
self.driver.get("https://www.baidu.com")
def tearDown():
"""
測試結束后環(huán)境復原,這里就是瀏覽器關(guān)閉退出
"""
self.driver.quit()
def test_search1(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python2')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python2' in self.driver.title
print('檢索python2完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search2(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python3')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python3' in self.driver.title
print('檢索python3完成')
except Exception as e:
print('檢索失敗', format(e))
if __name__ == '__main__':
unittest.main()
在PyCharm中運行里面代碼,我們會(huì )發(fā)覺(jué)瀏覽器打開(kāi)關(guān)掉了兩次,分別檢索了python2關(guān)掉瀏覽器,然后檢索python3關(guān)掉瀏覽器。
這個(gè)療效其實(shí)不是我們希望的,我們希望檢索完python2后,不用關(guān)掉瀏覽器繼續檢索python3,Unittest有相關(guān)的設置嗎?答案是肯定的,我們對以上代碼做下調整更改,注意對比不同的地方,然后運行就達到我們想要的療效
'''
Code description:
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
import time
import unittest
from selenium import webdriver
class Search(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""
測試前置條件,這里要搜索的話(huà)就是先得打開(kāi)百度網(wǎng)站啦
"""
cls.driver = webdriver.Ie()
cls.driver.maximize_window()
cls.driver.implicitly_wait(5)
cls.driver.get("https://www.baidu.com")
@classmethod
def tearDownClass(cls):
"""
測試結束后環(huán)境復原,這里就是瀏覽器關(guān)閉退出
"""
cls.driver.quit()
def test_search1(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python2')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python2' in self.driver.title
print('檢索python2完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search2(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').clear() # 清空之前輸入的python2
self.driver.find_element_by_id('kw').send_keys('python3')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python3' in self.driver.title
print('檢索python3完成')
except Exception as e:
print('檢索失敗', format(e))
if __name__ == '__main__':
unittest.main()
三、Unittest模塊批量加載和管理用例
以上對于Unittest框架,我們似乎只用到了測試固件、測試用例兩個(gè)邏輯單元的使用,接下來(lái)問(wèn)題又來(lái)了:我們日常項目中的測試案例肯定不止一個(gè),當案例越來(lái)越多時(shí)我們怎樣管理那些批量案例?如何保證案例不重復?如果案例特別多(成百上千,甚至更多)時(shí)怎么保證案例執行的效率?
來(lái)看一下在unittest框架中怎樣管理批量用例:

手動(dòng)添加采集指定的測試用例集用法:先在PyCharm中新建如下項目層級:

其中baidu_search1還是里面調整更改過(guò)的代碼,然后編輯run_case.py文件,代碼如下:
'''
Code description: 執行add 的測試用例集
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
from testcase.sreach.baidu_sreach1 import Search # 將baidu_sreach.py模塊導入進(jìn)來(lái)
import unittest
suite = unittest.TestSuite() # 構造測試用例集
# suite.addTest(Search("test_search1"))
suite.addTest(Search("test_search2")) # 分別添加baidu_sreach1.py中的兩個(gè)檢索的測試用例
if __name__ == '__main__':
runner = unittest.TextTestRunner() # 實(shí)例化runner
runner.run(suite) #執行測試
這樣運行run_case.py,就只執行了在百度中搜索python3這條用例,手動(dòng)添加指定用例到測試套件的方式是addTest(),但是好多時(shí)侯我們寫(xiě)了好多測試腳本文件,每個(gè)腳本中有多個(gè)test,,如果還是使用addTest()方法就不行了,我們希望能獲取所有的測試集,并全部執行。然后編輯run_all_case.py文件,編寫(xiě)如下代碼:
'''
Code description: TestLoader所有測試case
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
import time
import os.path
import unittest
from selenium import webdriver
class Search(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""
測試前置條件,這里要搜索的話(huà)就是先得打開(kāi)百度網(wǎng)站啦
"""
cls.driver = webdriver.Ie()
cls.driver.maximize_window()
cls.driver.implicitly_wait(5)
cls.driver.get("https://www.baidu.com")
@classmethod
def tearDownClass(cls):
"""
測試結束后環(huán)境復原,這里就是瀏覽器關(guān)閉退出
"""
cls.driver.quit()
def test_search1(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python2')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python2' in self.driver.title
print('檢索python2完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search2(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').clear() # 清空之前輸入的python2
self.driver.find_element_by_id('kw').send_keys('python3')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python3' in self.driver.title
print('檢索python3完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search3(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').clear() # 清空之前輸入的python3
self.driver.find_element_by_id('kw').send_keys('hello world')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'hello world' in self.driver.title
print('檢索hello world完成')
except Exception as e:
print('檢索失敗', format(e))
case_path = os.path.join(os.getcwd()) # 在當前目錄中采集測試用例
print(case_path)
all_case = unittest.defaultTestLoader.discover(case_path, pattern="test*.py", top_level_dir=None) # 采集所有test開(kāi)頭的測試用例
print(all_case)
if __name__ == '__main__':
runner = unittest.TextTestRunner() # 實(shí)例化runner
runner.run(all_case) # 執行測試
獲取所有的測試用例集使用的是discover()方法,在PyCharm中運行該腳本就如下:

以上就完成了在Python Unittest單元測試框架下編撰測試用例腳本,并使用其提供的多種方式來(lái)批量管理測試用例集并并執行。
轉載于:
使用Python3編撰一個(gè)爬蟲(chóng)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 229 次瀏覽 ? 2020-08-23 07:12
使用Python3編撰一個(gè)爬蟲(chóng)需求簡(jiǎn)介
最近廠(chǎng)里有一個(gè)新聞采集類(lèi)的需求,細節大體如下:
模擬登陸一個(gè)外網(wǎng)網(wǎng)站(SSO)抓取新聞(支持代理服務(wù)器的形式訪(fǎng)問(wèn))加工內容款式,以適配手機屏幕將正文中的圖片轉存到自已的服務(wù)器,并替換img標簽中的url圖片儲存服務(wù)器須要復用已有的FastDFS分布式文件系統采集結果導出生產(chǎn)庫支持日志復印
初學(xué)Python3,正好用這個(gè)需求練練手,最后太吃驚的是只用200多行代碼就實(shí)現了,如果換成Java的話(huà)大約須要1200行吧。果然應了那句俗話(huà):人生苦短,我用Python
登錄頁(yè)面抓包
第一步其實(shí)是抓包,然后再按照抓到的內容,模擬進(jìn)行HTTP懇求。
常用的抓包工具,有Mac下的Charles和Windows下的Fiddler。
它們的原理都是在本機開(kāi)一個(gè)HTTP或SOCKS代理服務(wù)器端口,然后將瀏覽器的代理服務(wù)器設置成這個(gè)端口,這樣瀏覽器中所有的HTTP懇求就會(huì )先經(jīng)過(guò)抓包工具記錄出來(lái)了。
這里推薦盡量使用Fiddler,原因是Charles對于cookie的展示是有bug的,舉個(gè)事例,真實(shí)情況:請求A返回了LtpaToken這個(gè)cookie,請求B中返回了sid這個(gè)cookie。但在Charles中的展示是:請求A中早已同時(shí)返回了LtpaToken和sid兩個(gè)cookie,這就很容易欺騙人了。
另外Fiddler如今早已有了Linux的Beta版本,貌似是用類(lèi)似wine的形式實(shí)現的。
如果網(wǎng)站使用了單點(diǎn)登錄,可能會(huì )涉及到手工生成cookie。所以除了須要剖析每一條HTTP請求的request和response,以及帶回去的cookie,還要對頁(yè)面中的javascript進(jìn)行剖析,看一下是怎樣生成cookie的。
模擬登陸
將頁(yè)面剖析完畢以后,就可以進(jìn)行模擬HTTP懇求了。
這里有兩個(gè)非常好用的第三方庫, request 和 BeautifulSoup
requests 庫是拿來(lái)替代urllib的,可以十分人性化的的生成HTTP請求,模擬session以及偽造cookie更是便捷。
BeautifulSoup 用來(lái)取代re模塊,進(jìn)行HTML內容解析,可以用tag, class, id來(lái)定位想要提取的內容,也支持正則表達式等。
具體的使用方法直接看官方文檔就可以了,寫(xiě)的特別詳盡,這里直接給出地址:
requests官方文檔
BeautifulSoup官方文檔
通過(guò)pip3來(lái)安裝這兩個(gè)模塊:
sudo apt-get install python3-pip
sudo pip3 install requests
sudo pip3 install beautifulsoup4
導入模塊:
import requests
from bs4 import BeautifulSoup
模擬登陸:
def sso_login():
# 調用單點(diǎn)登錄工號認證頁(yè)面
response = session.post(const.SSO_URL,
data={'login': const.LOGIN_USERNAME, 'password': const.LOGIN_PASSWORD, 'appid': 'np000'})
# 分析頁(yè)面,取token及l(fā)tpa
soup = BeautifulSoup(response.text, 'html.parser')
token = soup.form.input.get('value')
ltpa = soup.form.input.input.input.get('value')
ltpa_value = ltpa.split(';')[0].split('=', 1)[1]
# 手工設置Cookie
session.cookies.set('LtpaToken', ltpa_value, domain='unicom.local', path='/')
# 調用云門(mén)戶(hù)登錄頁(yè)面(2次)
payload = {'token': token}
session.post(const.LOGIN_URL, data=payload, proxies=const.PROXIES)
response = session.post(const.LOGIN_URL, data=payload, proxies=const.PROXIES)
if response.text == "success":
logging.info("登錄成功")
return True
else:
logging.info("登錄失敗")
return False
這里用到了BeautifulSoup進(jìn)行HTML解析,取出頁(yè)面中的token、ltpa等數組。
然后使用session.cookies.set偽造了一個(gè)cookie,注意其中的domain參數,設置成1級域名。
然后用這個(gè)session,去調用網(wǎng)站頁(yè)面,換回sid這個(gè)token。并可以依據頁(yè)面的返回信息,來(lái)簡(jiǎn)單判定一下成功還是失敗。
列表頁(yè)面抓取
登錄成功以后,接下來(lái)的列表頁(yè)面抓取就要簡(jiǎn)單的多了,不考慮分頁(yè)的話(huà),直接取一個(gè)list下來(lái)遍歷即可。
def capture_list(list_url):
response = session.get(list_url, proxies=const.PROXIES)
response.encoding = "UTF-8"
soup = BeautifulSoup(response.text, 'html.parser')
news_list = soup.find('div', 'xinwen_list').find_all('a')
news_list.reverse()
logging.info("開(kāi)始采集")
for news_archor in news_list:
news_cid = news_archor.attrs['href'].split('=')[1]
capture_content(news_cid)
logging.info("結束采集")
這里使用了response.encoding = "UTF-8"來(lái)手工解決亂碼問(wèn)題。
新聞頁(yè)面抓取
新聞頁(yè)面抓取,涉及到插臨時(shí)表,這里沒(méi)有使用每三方庫,直接用SQL形式插入。
其中涉及到款式處理與圖片轉存,另寫(xiě)一個(gè)模塊pconvert來(lái)實(shí)現。
def capture_content(news_cid):
# 建立DB連接
conn = mysql.connector.connect(user=const.DB_USERNAME, password=const.DB_PASSWORD, host=const.DB_HOST,
port=const.DB_PORT, database=const.DB_DATABASE)
cursor = conn.cursor()
# 判斷是否已存在
cursor.execute('select count(*) from material_prepare where news_cid = %s', (news_cid,))
news_count = cursor.fetchone()[0]
if news_count > 0:
logging.info("采集" + news_cid + ':已存在')
else:
logging.info("采集" + news_cid + ':新增')
news_url = const.NEWS_BASE_URL + news_cid
response = session.post(news_url, proxies=const.PROXIES)
response.encoding = "UTF-8"
soup = BeautifulSoup(response.text, 'html.parser')
# logging.info(soup)
news_title = soup.h3.text.strip()[:64]
news_brief = soup.find('div', 'brief').p.text.strip()[:100]
news_author = soup.h5.span.a.text.strip()[:100]
news_content = soup.find('table', 'unis_detail_content').tr.td.prettify()[66:-7].strip()
# 樣式處理
news_content = pconvert.convert_style(news_content)
# 將圖片轉存至DFS并替換URL
news_content = pconvert.convert_img(news_content)
# 入表
cursor.execute(
'INSERT INTO material_prepare (news_cid, title, author, summary, content, add_time, status) VALUES (%s, %s, %s, %s, %s, now(), "0")'
, [news_cid, news_title, news_author, news_brief, news_content])
# 提交
conn.commit()
cursor.close()
樣式處理
文本式樣處理,還是要用到BeautifulSoup,因為原創(chuàng )站點(diǎn)上的新聞內容款式是五花八門(mén)的,根據實(shí)際情況,一邊寫(xiě)一個(gè)test函數來(lái)生成文本,一邊在瀏覽器上漸漸調試。
def convert_style(rawtext):
newtext = '' \
+ rawtext + ''
newtext = newtext.replace(' align="center"', '')
soup = BeautifulSoup(newtext, 'html.parser')
img_tags = soup.find_all("img")
for img_tag in img_tags:
del img_tag.parent['style']
return soup.prettify()
圖片轉存至DFS
因為原創(chuàng )站點(diǎn)是在外網(wǎng)中的,采集下來(lái)的HTML中,
標簽的地址是外網(wǎng)地址,所以在網(wǎng)段中是詮釋不下來(lái)的,需要將圖片轉存,并用新的URL替換原有的URL。
def convert_img(rawtext):
soup = BeautifulSoup(rawtext, 'html.parser')
img_tags = soup.find_all("img")
for img_tag in img_tags:
raw_img_url = img_tag['src']
dfs_img_url = convert_url(raw_img_url)
img_tag['src'] = dfs_img_url
del img_tag['style']
return soup.prettify()
圖片轉存最簡(jiǎn)單的形式是保存成本地的文件,然后再通過(guò)nginx或httpd服務(wù)將圖片開(kāi)放出去:
pic_name = raw_img_url.split('/')[-1]
pic_path = TMP_PATH + '/' + pic_name
with open(pic_path, 'wb') as pic_file:
pic_file.write(pic_content)
但這兒我們須要復用已有的FastDFS分布式文件系統,要用到它的一個(gè)客戶(hù)端的庫fdfs_client-py
fdfs_client-py不能直接使用pip3安裝,需要直接使用一個(gè)python3版的源碼,并手工更改其中代碼。操作過(guò)程如下:
git clone https://github.com/jefforeilly/fdfs_client-py.git
cd dfs_client-py
vi ./fdfs_client/storage_client.py
將第12行 from fdfs_client.sendfile import * 注釋掉
python3 setup.py install
sudo pip3 install mutagen
客戶(hù)端的使用上沒(méi)有哪些非常的,直接調用upload_by_buffer,傳一個(gè)圖片的buffer進(jìn)去就可以了,成功后會(huì )返回手動(dòng)生成的文件名。
from fdfs_client.client import *
dfs_client = Fdfs_client('conf/dfs.conf')
def convert_url(raw_img_url):
response = requests.get(raw_img_url, proxies=const.PROXIES)
pic_buffer = response.content
pic_ext = raw_img_url.split('.')[-1]
response = dfs_client.upload_by_buffer(pic_buffer, pic_ext)
dfs_img_url = const.DFS_BASE_URL + '/' + response['Remote file_id']
return dfs_img_url
其中dfs.conf文件中,主要就是配置一下 tracker_server
日志處理
這里使用配置文件的形式處理日志,類(lèi)似JAVA中的log4j吧,首先新建一個(gè)log.conf:
[loggers]
keys=root
[handlers]
keys=stream_handler,file_handler
[formatters]
keys=formatter
[logger_root]
level=DEBUG
handlers=stream_handler,file_handler
[handler_stream_handler]
class=StreamHandler
level=DEBUG
formatter=formatter
args=(sys.stderr,)
[handler_file_handler]
class=FileHandler
level=DEBUG
formatter=formatter
args=('logs/pspider.log','a','utf8')
[formatter_formatter]
format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s
這里通過(guò)配置handlers,可以同時(shí)將日志復印到stderr和文件。
注意args=('logs/pspider.log','a','utf8') 這一行,用來(lái)解決文本文件中的英文亂碼問(wèn)題。
日志初始化:
import logging
from logging.config import fileConfig
fileConfig('conf/log.conf')
日志復?。?br /> logging.info("test")
完整源碼
到此為止,就是怎樣用Python3寫(xiě)一個(gè)爬蟲(chóng)的全部過(guò)程了。
采集不同的站點(diǎn),肯定是要有不同的處理,但方式都是大同小異。 查看全部
使用Python3編撰一個(gè)爬蟲(chóng)
使用Python3編撰一個(gè)爬蟲(chóng)需求簡(jiǎn)介
最近廠(chǎng)里有一個(gè)新聞采集類(lèi)的需求,細節大體如下:
模擬登陸一個(gè)外網(wǎng)網(wǎng)站(SSO)抓取新聞(支持代理服務(wù)器的形式訪(fǎng)問(wèn))加工內容款式,以適配手機屏幕將正文中的圖片轉存到自已的服務(wù)器,并替換img標簽中的url圖片儲存服務(wù)器須要復用已有的FastDFS分布式文件系統采集結果導出生產(chǎn)庫支持日志復印
初學(xué)Python3,正好用這個(gè)需求練練手,最后太吃驚的是只用200多行代碼就實(shí)現了,如果換成Java的話(huà)大約須要1200行吧。果然應了那句俗話(huà):人生苦短,我用Python
登錄頁(yè)面抓包
第一步其實(shí)是抓包,然后再按照抓到的內容,模擬進(jìn)行HTTP懇求。
常用的抓包工具,有Mac下的Charles和Windows下的Fiddler。
它們的原理都是在本機開(kāi)一個(gè)HTTP或SOCKS代理服務(wù)器端口,然后將瀏覽器的代理服務(wù)器設置成這個(gè)端口,這樣瀏覽器中所有的HTTP懇求就會(huì )先經(jīng)過(guò)抓包工具記錄出來(lái)了。
這里推薦盡量使用Fiddler,原因是Charles對于cookie的展示是有bug的,舉個(gè)事例,真實(shí)情況:請求A返回了LtpaToken這個(gè)cookie,請求B中返回了sid這個(gè)cookie。但在Charles中的展示是:請求A中早已同時(shí)返回了LtpaToken和sid兩個(gè)cookie,這就很容易欺騙人了。
另外Fiddler如今早已有了Linux的Beta版本,貌似是用類(lèi)似wine的形式實(shí)現的。
如果網(wǎng)站使用了單點(diǎn)登錄,可能會(huì )涉及到手工生成cookie。所以除了須要剖析每一條HTTP請求的request和response,以及帶回去的cookie,還要對頁(yè)面中的javascript進(jìn)行剖析,看一下是怎樣生成cookie的。
模擬登陸
將頁(yè)面剖析完畢以后,就可以進(jìn)行模擬HTTP懇求了。
這里有兩個(gè)非常好用的第三方庫, request 和 BeautifulSoup
requests 庫是拿來(lái)替代urllib的,可以十分人性化的的生成HTTP請求,模擬session以及偽造cookie更是便捷。
BeautifulSoup 用來(lái)取代re模塊,進(jìn)行HTML內容解析,可以用tag, class, id來(lái)定位想要提取的內容,也支持正則表達式等。
具體的使用方法直接看官方文檔就可以了,寫(xiě)的特別詳盡,這里直接給出地址:
requests官方文檔
BeautifulSoup官方文檔
通過(guò)pip3來(lái)安裝這兩個(gè)模塊:
sudo apt-get install python3-pip
sudo pip3 install requests
sudo pip3 install beautifulsoup4
導入模塊:
import requests
from bs4 import BeautifulSoup
模擬登陸:
def sso_login():
# 調用單點(diǎn)登錄工號認證頁(yè)面
response = session.post(const.SSO_URL,
data={'login': const.LOGIN_USERNAME, 'password': const.LOGIN_PASSWORD, 'appid': 'np000'})
# 分析頁(yè)面,取token及l(fā)tpa
soup = BeautifulSoup(response.text, 'html.parser')
token = soup.form.input.get('value')
ltpa = soup.form.input.input.input.get('value')
ltpa_value = ltpa.split(';')[0].split('=', 1)[1]
# 手工設置Cookie
session.cookies.set('LtpaToken', ltpa_value, domain='unicom.local', path='/')
# 調用云門(mén)戶(hù)登錄頁(yè)面(2次)
payload = {'token': token}
session.post(const.LOGIN_URL, data=payload, proxies=const.PROXIES)
response = session.post(const.LOGIN_URL, data=payload, proxies=const.PROXIES)
if response.text == "success":
logging.info("登錄成功")
return True
else:
logging.info("登錄失敗")
return False
這里用到了BeautifulSoup進(jìn)行HTML解析,取出頁(yè)面中的token、ltpa等數組。
然后使用session.cookies.set偽造了一個(gè)cookie,注意其中的domain參數,設置成1級域名。
然后用這個(gè)session,去調用網(wǎng)站頁(yè)面,換回sid這個(gè)token。并可以依據頁(yè)面的返回信息,來(lái)簡(jiǎn)單判定一下成功還是失敗。
列表頁(yè)面抓取
登錄成功以后,接下來(lái)的列表頁(yè)面抓取就要簡(jiǎn)單的多了,不考慮分頁(yè)的話(huà),直接取一個(gè)list下來(lái)遍歷即可。
def capture_list(list_url):
response = session.get(list_url, proxies=const.PROXIES)
response.encoding = "UTF-8"
soup = BeautifulSoup(response.text, 'html.parser')
news_list = soup.find('div', 'xinwen_list').find_all('a')
news_list.reverse()
logging.info("開(kāi)始采集")
for news_archor in news_list:
news_cid = news_archor.attrs['href'].split('=')[1]
capture_content(news_cid)
logging.info("結束采集")
這里使用了response.encoding = "UTF-8"來(lái)手工解決亂碼問(wèn)題。
新聞頁(yè)面抓取
新聞頁(yè)面抓取,涉及到插臨時(shí)表,這里沒(méi)有使用每三方庫,直接用SQL形式插入。
其中涉及到款式處理與圖片轉存,另寫(xiě)一個(gè)模塊pconvert來(lái)實(shí)現。
def capture_content(news_cid):
# 建立DB連接
conn = mysql.connector.connect(user=const.DB_USERNAME, password=const.DB_PASSWORD, host=const.DB_HOST,
port=const.DB_PORT, database=const.DB_DATABASE)
cursor = conn.cursor()
# 判斷是否已存在
cursor.execute('select count(*) from material_prepare where news_cid = %s', (news_cid,))
news_count = cursor.fetchone()[0]
if news_count > 0:
logging.info("采集" + news_cid + ':已存在')
else:
logging.info("采集" + news_cid + ':新增')
news_url = const.NEWS_BASE_URL + news_cid
response = session.post(news_url, proxies=const.PROXIES)
response.encoding = "UTF-8"
soup = BeautifulSoup(response.text, 'html.parser')
# logging.info(soup)
news_title = soup.h3.text.strip()[:64]
news_brief = soup.find('div', 'brief').p.text.strip()[:100]
news_author = soup.h5.span.a.text.strip()[:100]
news_content = soup.find('table', 'unis_detail_content').tr.td.prettify()[66:-7].strip()
# 樣式處理
news_content = pconvert.convert_style(news_content)
# 將圖片轉存至DFS并替換URL
news_content = pconvert.convert_img(news_content)
# 入表
cursor.execute(
'INSERT INTO material_prepare (news_cid, title, author, summary, content, add_time, status) VALUES (%s, %s, %s, %s, %s, now(), "0")'
, [news_cid, news_title, news_author, news_brief, news_content])
# 提交
conn.commit()
cursor.close()
樣式處理
文本式樣處理,還是要用到BeautifulSoup,因為原創(chuàng )站點(diǎn)上的新聞內容款式是五花八門(mén)的,根據實(shí)際情況,一邊寫(xiě)一個(gè)test函數來(lái)生成文本,一邊在瀏覽器上漸漸調試。
def convert_style(rawtext):
newtext = '' \
+ rawtext + ''
newtext = newtext.replace(' align="center"', '')
soup = BeautifulSoup(newtext, 'html.parser')
img_tags = soup.find_all("img")
for img_tag in img_tags:
del img_tag.parent['style']
return soup.prettify()
圖片轉存至DFS
因為原創(chuàng )站點(diǎn)是在外網(wǎng)中的,采集下來(lái)的HTML中,
標簽的地址是外網(wǎng)地址,所以在網(wǎng)段中是詮釋不下來(lái)的,需要將圖片轉存,并用新的URL替換原有的URL。
def convert_img(rawtext):
soup = BeautifulSoup(rawtext, 'html.parser')
img_tags = soup.find_all("img")
for img_tag in img_tags:
raw_img_url = img_tag['src']
dfs_img_url = convert_url(raw_img_url)
img_tag['src'] = dfs_img_url
del img_tag['style']
return soup.prettify()
圖片轉存最簡(jiǎn)單的形式是保存成本地的文件,然后再通過(guò)nginx或httpd服務(wù)將圖片開(kāi)放出去:
pic_name = raw_img_url.split('/')[-1]
pic_path = TMP_PATH + '/' + pic_name
with open(pic_path, 'wb') as pic_file:
pic_file.write(pic_content)
但這兒我們須要復用已有的FastDFS分布式文件系統,要用到它的一個(gè)客戶(hù)端的庫fdfs_client-py
fdfs_client-py不能直接使用pip3安裝,需要直接使用一個(gè)python3版的源碼,并手工更改其中代碼。操作過(guò)程如下:
git clone https://github.com/jefforeilly/fdfs_client-py.git
cd dfs_client-py
vi ./fdfs_client/storage_client.py
將第12行 from fdfs_client.sendfile import * 注釋掉
python3 setup.py install
sudo pip3 install mutagen
客戶(hù)端的使用上沒(méi)有哪些非常的,直接調用upload_by_buffer,傳一個(gè)圖片的buffer進(jìn)去就可以了,成功后會(huì )返回手動(dòng)生成的文件名。
from fdfs_client.client import *
dfs_client = Fdfs_client('conf/dfs.conf')
def convert_url(raw_img_url):
response = requests.get(raw_img_url, proxies=const.PROXIES)
pic_buffer = response.content
pic_ext = raw_img_url.split('.')[-1]
response = dfs_client.upload_by_buffer(pic_buffer, pic_ext)
dfs_img_url = const.DFS_BASE_URL + '/' + response['Remote file_id']
return dfs_img_url
其中dfs.conf文件中,主要就是配置一下 tracker_server
日志處理
這里使用配置文件的形式處理日志,類(lèi)似JAVA中的log4j吧,首先新建一個(gè)log.conf:
[loggers]
keys=root
[handlers]
keys=stream_handler,file_handler
[formatters]
keys=formatter
[logger_root]
level=DEBUG
handlers=stream_handler,file_handler
[handler_stream_handler]
class=StreamHandler
level=DEBUG
formatter=formatter
args=(sys.stderr,)
[handler_file_handler]
class=FileHandler
level=DEBUG
formatter=formatter
args=('logs/pspider.log','a','utf8')
[formatter_formatter]
format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s
這里通過(guò)配置handlers,可以同時(shí)將日志復印到stderr和文件。
注意args=('logs/pspider.log','a','utf8') 這一行,用來(lái)解決文本文件中的英文亂碼問(wèn)題。
日志初始化:
import logging
from logging.config import fileConfig
fileConfig('conf/log.conf')
日志復?。?br /> logging.info("test")
完整源碼
到此為止,就是怎樣用Python3寫(xiě)一個(gè)爬蟲(chóng)的全部過(guò)程了。
采集不同的站點(diǎn),肯定是要有不同的處理,但方式都是大同小異。
Python爬蟲(chóng)建站入門(mén)雜記——從零開(kāi)始構建采集站點(diǎn)(二:編寫(xiě)爬蟲(chóng))
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 378 次瀏覽 ? 2020-08-23 06:51
上回,我裝了環(huán)境
也就是一對亂七八糟的東西
裝了pip,用pip裝了virtualenv,建立了一個(gè)virtualenv,在這個(gè)virtualenv上面,裝了Django,創(chuàng )建了一個(gè)Django項目,在這個(gè)Django項目上面創(chuàng )建了一個(gè)稱(chēng)作web的阿皮皮。
接上回~
第二部份,編寫(xiě)爬蟲(chóng)。
工欲善其事,必先利其器。
bashapt-get install vim # 接上回,我們在screen里面是root身份哦~
當然了,現在我要想一個(gè)采集的目標,為了便捷,我就選擇segmentfault吧,這網(wǎng)站寫(xiě)博客不錯,就是在海外上傳圖片有點(diǎn)慢。
這個(gè)爬蟲(chóng),就像我訪(fǎng)問(wèn)一樣,要分步驟來(lái)。 我先聽(tīng)到segmentfault首頁(yè),然后發(fā)覺(jué)上面有很多tags,每個(gè)tags下邊,才是一個(gè)一個(gè)的問(wèn)題的內容。
所以,爬蟲(chóng)也要分為這幾個(gè)步驟來(lái)寫(xiě)。 但是我要反著(zhù)寫(xiě),先寫(xiě)內容爬蟲(chóng),再寫(xiě)分類(lèi)爬蟲(chóng), 因為我想。
2.1 編寫(xiě)內容爬蟲(chóng)
首先,給爬蟲(chóng)構建個(gè)目錄,在項目上面和app同級,然后把這個(gè)目錄弄成一個(gè)python的package
bashmkdir ~/python_spider/sfspider
touch ~/python_spider/sfspider/__init__.py
以后,這個(gè)目錄就叫爬蟲(chóng)包了
在爬蟲(chóng)包上面構建一個(gè)spider.py拿來(lái)裝我的爬蟲(chóng)們
bashvim ~/python_spider/sfspider/spider.py
一個(gè)基本的爬蟲(chóng),只須要下邊幾行代碼:
?。ùa下邊會(huì )提供)
然后呢,就可以玩兒我們的“爬蟲(chóng)”了。
進(jìn)入python shell
python>>> from sfspider import spider
>>> s = spider.SegmentfaultQuestionSpider('1010000002542775')
>>> s.url
>>> 'http://segmentfault.com/q/1010000002542775'
>>> print s.dom('h1#questionTitle').text()
>>> 微信JS—SDK嵌套選擇圖片和上傳圖片接口,實(shí)現一鍵上傳圖片,遇到問(wèn)題
看吧,我如今早已可以通過(guò)爬蟲(chóng)獲取segmentfault的提問(wèn)標題了。下一步,為了簡(jiǎn)化代碼,我把標題,回答等等的屬性都寫(xiě)為這個(gè)蜘蛛的屬性。代碼如下
python# -*- coding: utf-8 -*-
import requests # requests作為我們的html客戶(hù)端
from pyquery import PyQuery as Pq # pyquery來(lái)操作dom
class SegmentfaultQuestionSpider(object):
def __init__(self, segmentfault_id): # 參數為在segmentfault上的id
self.url = 'http://segmentfault.com/q/{0}'.format(segmentfault_id)
self._dom = None # 弄個(gè)這個(gè)來(lái)緩存獲取到的html內容,一個(gè)蜘蛛應該之訪(fǎng)問(wèn)一次
@property
def dom(self): # 獲取html內容
if not self._dom:
document = requests.get(self.url)
document.encoding = 'utf-8'
self._dom = Pq(document.text)
return self._dom
@property
def title(self): # 讓方法可以通過(guò)s.title的方式訪(fǎng)問(wèn) 可以少打對括號
return self.dom('h1#questionTitle').text() # 關(guān)于選擇器可以參考css selector或者jquery selector, 它們在pyquery下幾乎都可以使用
@property
def content(self):
return self.dom('.question.fmt').html() # 直接獲取html 膽子就是大 以后再來(lái)過(guò)濾
@property
def answers(self):
return list(answer.html() for answer in self.dom('.answer.fmt').items()) # 記住,Pq實(shí)例的items方法是很有用的
@property
def tags(self):
return self.dom('ul.taglist--inline > li').text().split() # 獲取tags,這里直接用text方法,再切分就行了。一般只要是文字內容,而且文字內容自己沒(méi)有空格,逗號等,都可以這樣弄,省事。
然后,再把玩一下升級后的蜘蛛。
python>>> from sfspider import spider
>>> s = spider.SegmentfaultQuestionSpider('1010000002542775')
>>> print s.title
>>> 微信JS—SDK嵌套選擇圖片和上傳圖片接口,實(shí)現一鍵上傳圖片,遇到問(wèn)題
>>> print s.content
>>> # [故意省略] #
>>> for answer in s.answers
print answer
>>> # [故意省略] #
>>> print '/'.join(s.tags)
>>> 微信js-sdk/python/微信開(kāi)發(fā)/javascript
OK,現在我的蜘蛛玩上去更方便了。
2.2 編寫(xiě)分類(lèi)爬蟲(chóng)
下面,我要寫(xiě)一個(gè)抓取標簽頁(yè)面的問(wèn)題的爬蟲(chóng)。
代碼如下, 注意下邊的代碼是添加在已有代碼下邊的, 和之前的最后一行之間 要有兩個(gè)空行
pythonclass SegmentfaultTagSpider(object):
def __init__(self, tag_name, page=1):
self.url = 'http://segmentfault.com/t/%s?type=newest&page=%s' % (tag_name, page)
self.tag_name = tag_name
self.page = page
self._dom = None
@property
def dom(self):
if not self._dom:
document = requests.get(self.url)
document.encoding = 'utf-8'
self._dom = Pq(document.text)
self._dom.make_links_absolute(base_url="http://segmentfault.com/") # 相對鏈接變成絕對鏈接 爽
return self._dom
@property
def questions(self):
return [question.attr('href') for question in self.dom('h2.title > a').items()]
@property
def has_next_page(self): # 看看還有沒(méi)有下一頁(yè),這個(gè)有必要
return bool(self.dom('ul.pagination > li.next')) # 看看有木有下一頁(yè)
def next_page(self): # 把這個(gè)蜘蛛殺了, 產(chǎn)生一個(gè)新的蜘蛛 抓取下一頁(yè)。 由于這個(gè)本來(lái)就是個(gè)動(dòng)詞,所以就不加@property了
if self.has_next_page:
self.__init__(tag_name=self.tag_name ,page=self.page+1)
else:
return None
現在可以?xún)蓚€(gè)蜘蛛一起把玩了,就不貼出詳盡把玩過(guò)程了。。。
python>>> from sfspider import spider
>>> s = spider.SegmentfaultTagSpider('微信')
>>> question1 = s.questions[0]
>>> question_spider = spider.SegmentfaultQuestionSpider(question1.split('/')[-1])
>>> # [故意省略] #
想做竊賊站的,看到這兒基本上能夠搞下來(lái)了。 套個(gè)模板 加一個(gè)簡(jiǎn)單的腳本來(lái)接受和返回懇求就行了。
未完待續。 查看全部
Python爬蟲(chóng)建站入門(mén)雜記——從零開(kāi)始構建采集站點(diǎn)(二:編寫(xiě)爬蟲(chóng))
上回,我裝了環(huán)境
也就是一對亂七八糟的東西
裝了pip,用pip裝了virtualenv,建立了一個(gè)virtualenv,在這個(gè)virtualenv上面,裝了Django,創(chuàng )建了一個(gè)Django項目,在這個(gè)Django項目上面創(chuàng )建了一個(gè)稱(chēng)作web的阿皮皮。
接上回~
第二部份,編寫(xiě)爬蟲(chóng)。
工欲善其事,必先利其器。
bashapt-get install vim # 接上回,我們在screen里面是root身份哦~
當然了,現在我要想一個(gè)采集的目標,為了便捷,我就選擇segmentfault吧,這網(wǎng)站寫(xiě)博客不錯,就是在海外上傳圖片有點(diǎn)慢。
這個(gè)爬蟲(chóng),就像我訪(fǎng)問(wèn)一樣,要分步驟來(lái)。 我先聽(tīng)到segmentfault首頁(yè),然后發(fā)覺(jué)上面有很多tags,每個(gè)tags下邊,才是一個(gè)一個(gè)的問(wèn)題的內容。
所以,爬蟲(chóng)也要分為這幾個(gè)步驟來(lái)寫(xiě)。 但是我要反著(zhù)寫(xiě),先寫(xiě)內容爬蟲(chóng),再寫(xiě)分類(lèi)爬蟲(chóng), 因為我想。
2.1 編寫(xiě)內容爬蟲(chóng)
首先,給爬蟲(chóng)構建個(gè)目錄,在項目上面和app同級,然后把這個(gè)目錄弄成一個(gè)python的package
bashmkdir ~/python_spider/sfspider
touch ~/python_spider/sfspider/__init__.py
以后,這個(gè)目錄就叫爬蟲(chóng)包了
在爬蟲(chóng)包上面構建一個(gè)spider.py拿來(lái)裝我的爬蟲(chóng)們
bashvim ~/python_spider/sfspider/spider.py
一個(gè)基本的爬蟲(chóng),只須要下邊幾行代碼:
?。ùa下邊會(huì )提供)
然后呢,就可以玩兒我們的“爬蟲(chóng)”了。
進(jìn)入python shell
python>>> from sfspider import spider
>>> s = spider.SegmentfaultQuestionSpider('1010000002542775')
>>> s.url
>>> 'http://segmentfault.com/q/1010000002542775'
>>> print s.dom('h1#questionTitle').text()
>>> 微信JS—SDK嵌套選擇圖片和上傳圖片接口,實(shí)現一鍵上傳圖片,遇到問(wèn)題
看吧,我如今早已可以通過(guò)爬蟲(chóng)獲取segmentfault的提問(wèn)標題了。下一步,為了簡(jiǎn)化代碼,我把標題,回答等等的屬性都寫(xiě)為這個(gè)蜘蛛的屬性。代碼如下
python# -*- coding: utf-8 -*-
import requests # requests作為我們的html客戶(hù)端
from pyquery import PyQuery as Pq # pyquery來(lái)操作dom
class SegmentfaultQuestionSpider(object):
def __init__(self, segmentfault_id): # 參數為在segmentfault上的id
self.url = 'http://segmentfault.com/q/{0}'.format(segmentfault_id)
self._dom = None # 弄個(gè)這個(gè)來(lái)緩存獲取到的html內容,一個(gè)蜘蛛應該之訪(fǎng)問(wèn)一次
@property
def dom(self): # 獲取html內容
if not self._dom:
document = requests.get(self.url)
document.encoding = 'utf-8'
self._dom = Pq(document.text)
return self._dom
@property
def title(self): # 讓方法可以通過(guò)s.title的方式訪(fǎng)問(wèn) 可以少打對括號
return self.dom('h1#questionTitle').text() # 關(guān)于選擇器可以參考css selector或者jquery selector, 它們在pyquery下幾乎都可以使用
@property
def content(self):
return self.dom('.question.fmt').html() # 直接獲取html 膽子就是大 以后再來(lái)過(guò)濾
@property
def answers(self):
return list(answer.html() for answer in self.dom('.answer.fmt').items()) # 記住,Pq實(shí)例的items方法是很有用的
@property
def tags(self):
return self.dom('ul.taglist--inline > li').text().split() # 獲取tags,這里直接用text方法,再切分就行了。一般只要是文字內容,而且文字內容自己沒(méi)有空格,逗號等,都可以這樣弄,省事。
然后,再把玩一下升級后的蜘蛛。
python>>> from sfspider import spider
>>> s = spider.SegmentfaultQuestionSpider('1010000002542775')
>>> print s.title
>>> 微信JS—SDK嵌套選擇圖片和上傳圖片接口,實(shí)現一鍵上傳圖片,遇到問(wèn)題
>>> print s.content
>>> # [故意省略] #
>>> for answer in s.answers
print answer
>>> # [故意省略] #
>>> print '/'.join(s.tags)
>>> 微信js-sdk/python/微信開(kāi)發(fā)/javascript
OK,現在我的蜘蛛玩上去更方便了。
2.2 編寫(xiě)分類(lèi)爬蟲(chóng)
下面,我要寫(xiě)一個(gè)抓取標簽頁(yè)面的問(wèn)題的爬蟲(chóng)。
代碼如下, 注意下邊的代碼是添加在已有代碼下邊的, 和之前的最后一行之間 要有兩個(gè)空行
pythonclass SegmentfaultTagSpider(object):
def __init__(self, tag_name, page=1):
self.url = 'http://segmentfault.com/t/%s?type=newest&page=%s' % (tag_name, page)
self.tag_name = tag_name
self.page = page
self._dom = None
@property
def dom(self):
if not self._dom:
document = requests.get(self.url)
document.encoding = 'utf-8'
self._dom = Pq(document.text)
self._dom.make_links_absolute(base_url="http://segmentfault.com/") # 相對鏈接變成絕對鏈接 爽
return self._dom
@property
def questions(self):
return [question.attr('href') for question in self.dom('h2.title > a').items()]
@property
def has_next_page(self): # 看看還有沒(méi)有下一頁(yè),這個(gè)有必要
return bool(self.dom('ul.pagination > li.next')) # 看看有木有下一頁(yè)
def next_page(self): # 把這個(gè)蜘蛛殺了, 產(chǎn)生一個(gè)新的蜘蛛 抓取下一頁(yè)。 由于這個(gè)本來(lái)就是個(gè)動(dòng)詞,所以就不加@property了
if self.has_next_page:
self.__init__(tag_name=self.tag_name ,page=self.page+1)
else:
return None
現在可以?xún)蓚€(gè)蜘蛛一起把玩了,就不貼出詳盡把玩過(guò)程了。。。
python>>> from sfspider import spider
>>> s = spider.SegmentfaultTagSpider('微信')
>>> question1 = s.questions[0]
>>> question_spider = spider.SegmentfaultQuestionSpider(question1.split('/')[-1])
>>> # [故意省略] #
想做竊賊站的,看到這兒基本上能夠搞下來(lái)了。 套個(gè)模板 加一個(gè)簡(jiǎn)單的腳本來(lái)接受和返回懇求就行了。
未完待續。
爬蟲(chóng) 大規模數據 采集心得和示例
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 397 次瀏覽 ? 2020-08-23 04:03
本篇主要介紹網(wǎng)站數據特別大的采集心得
1. 什么樣的數據能夠稱(chēng)為數據量大:
我認為這個(gè)可能會(huì )由于每位人的理解不太一樣,給出的定義 也不相同。我覺(jué)得定義一個(gè)采集網(wǎng)站的數據大小,不僅僅要看這個(gè)網(wǎng)站包括的數據量的大小,還應當包括這個(gè)網(wǎng)址的采集難度,采集網(wǎng)站的服務(wù)器承受能力,采集人員所調配的網(wǎng)路帶寬和計算機硬件資源等。這里我暫且把一個(gè)網(wǎng)站超過(guò)一千萬(wàn)個(gè)URL鏈接的稱(chēng)作數據量大的網(wǎng)站。
2. 數據量大的網(wǎng)站采集方案:
2.1 . 采集需求剖析:
作為數據采集工程師,我覺(jué)得最重要的是要做好數據采集的需求剖析,首先要預估這個(gè)網(wǎng)址的數據量大小,然后去明晰采集哪些數據,有沒(méi)有必要去把目標網(wǎng)站的數據都采集下來(lái),因為采集的數據量越多,耗費的時(shí)間就越多,需要的資源就越多,對目標網(wǎng)站造成的壓力就越大,數據采集工程師不能為了采集數據,對目標網(wǎng)站造成很大的壓力。原則是盡量少采集數據來(lái)滿(mǎn)足自己的需求,避免全站采集。
2.2. 代碼編撰:
因為要采集的網(wǎng)站數據好多,所以要求編撰的代碼做到穩定運行一周甚至一個(gè)月以上,所以代碼要足夠的強壯,足夠的強大。一般要求做到網(wǎng)站不變更模板,程序能始終執行出來(lái)。這里有個(gè)編程的小技巧,我覺(jué)得很重要,就是代碼編撰好之后,先去跑一兩個(gè)小時(shí),發(fā)現程序的一些報錯的地方,修改掉,這樣的前期代碼測試,能保證代碼的健壯性。
2.3 數據儲存:
當數據量有三五千萬(wàn)的時(shí)侯,無(wú)論是MySQL還是Oracle還是SQL Server,想在一個(gè)表上面儲存,已經(jīng)不太可能了,這個(gè)時(shí)侯可以采用分表來(lái)儲存。數據采集完畢,往數據庫插入的時(shí)侯,可以執行批量插入等策略。保證自己的儲存不受數據庫性能等方面的影響。
2.4 調配的資源:
由于目標網(wǎng)站數據好多,我們免不了要去使用大的房貸,內存,CPU等資源,這個(gè)時(shí)侯我們可以搞一個(gè)分布式爬蟲(chóng)系統,來(lái)合理的管理我們的資源。
3. 爬蟲(chóng)的道德
對于一些中級的采集工程師,為了更快的采集到數據,往往開(kāi)了好多的多進(jìn)程和多線(xiàn)程,后果就是對目標網(wǎng)站造成了dos攻擊,結果是目標網(wǎng)站果斷的升級網(wǎng)站,加入更多的反爬策略,這種對抗對采集工程師也是非常不利的。個(gè)人建議下載速率不要超過(guò)2M,多進(jìn)程或則多線(xiàn)程不要過(guò)百。
示例:
要采集的目標網(wǎng)站有四千萬(wàn)數據,網(wǎng)站的反爬策略是封ip,于是專(zhuān)門(mén)找了一臺機器,開(kāi)了二百多個(gè)進(jìn)程去維護ip池,ip池可用的ip在500-1000個(gè),并且保證ip是高度可用的。
代碼編撰完畢后,同是在兩臺機器上運行,每天機器開(kāi)啟的多線(xiàn)程不超過(guò)64個(gè),下載速率不超過(guò)1M.
個(gè)人知識有限,請大牛多多包涵 查看全部
爬蟲(chóng) 大規模數據 采集心得和示例
本篇主要介紹網(wǎng)站數據特別大的采集心得
1. 什么樣的數據能夠稱(chēng)為數據量大:
我認為這個(gè)可能會(huì )由于每位人的理解不太一樣,給出的定義 也不相同。我覺(jué)得定義一個(gè)采集網(wǎng)站的數據大小,不僅僅要看這個(gè)網(wǎng)站包括的數據量的大小,還應當包括這個(gè)網(wǎng)址的采集難度,采集網(wǎng)站的服務(wù)器承受能力,采集人員所調配的網(wǎng)路帶寬和計算機硬件資源等。這里我暫且把一個(gè)網(wǎng)站超過(guò)一千萬(wàn)個(gè)URL鏈接的稱(chēng)作數據量大的網(wǎng)站。
2. 數據量大的網(wǎng)站采集方案:
2.1 . 采集需求剖析:
作為數據采集工程師,我覺(jué)得最重要的是要做好數據采集的需求剖析,首先要預估這個(gè)網(wǎng)址的數據量大小,然后去明晰采集哪些數據,有沒(méi)有必要去把目標網(wǎng)站的數據都采集下來(lái),因為采集的數據量越多,耗費的時(shí)間就越多,需要的資源就越多,對目標網(wǎng)站造成的壓力就越大,數據采集工程師不能為了采集數據,對目標網(wǎng)站造成很大的壓力。原則是盡量少采集數據來(lái)滿(mǎn)足自己的需求,避免全站采集。
2.2. 代碼編撰:
因為要采集的網(wǎng)站數據好多,所以要求編撰的代碼做到穩定運行一周甚至一個(gè)月以上,所以代碼要足夠的強壯,足夠的強大。一般要求做到網(wǎng)站不變更模板,程序能始終執行出來(lái)。這里有個(gè)編程的小技巧,我覺(jué)得很重要,就是代碼編撰好之后,先去跑一兩個(gè)小時(shí),發(fā)現程序的一些報錯的地方,修改掉,這樣的前期代碼測試,能保證代碼的健壯性。
2.3 數據儲存:
當數據量有三五千萬(wàn)的時(shí)侯,無(wú)論是MySQL還是Oracle還是SQL Server,想在一個(gè)表上面儲存,已經(jīng)不太可能了,這個(gè)時(shí)侯可以采用分表來(lái)儲存。數據采集完畢,往數據庫插入的時(shí)侯,可以執行批量插入等策略。保證自己的儲存不受數據庫性能等方面的影響。
2.4 調配的資源:
由于目標網(wǎng)站數據好多,我們免不了要去使用大的房貸,內存,CPU等資源,這個(gè)時(shí)侯我們可以搞一個(gè)分布式爬蟲(chóng)系統,來(lái)合理的管理我們的資源。
3. 爬蟲(chóng)的道德
對于一些中級的采集工程師,為了更快的采集到數據,往往開(kāi)了好多的多進(jìn)程和多線(xiàn)程,后果就是對目標網(wǎng)站造成了dos攻擊,結果是目標網(wǎng)站果斷的升級網(wǎng)站,加入更多的反爬策略,這種對抗對采集工程師也是非常不利的。個(gè)人建議下載速率不要超過(guò)2M,多進(jìn)程或則多線(xiàn)程不要過(guò)百。
示例:

要采集的目標網(wǎng)站有四千萬(wàn)數據,網(wǎng)站的反爬策略是封ip,于是專(zhuān)門(mén)找了一臺機器,開(kāi)了二百多個(gè)進(jìn)程去維護ip池,ip池可用的ip在500-1000個(gè),并且保證ip是高度可用的。
代碼編撰完畢后,同是在兩臺機器上運行,每天機器開(kāi)啟的多線(xiàn)程不超過(guò)64個(gè),下載速率不超過(guò)1M.
個(gè)人知識有限,請大牛多多包涵
[Android]橘子視頻。e4a源碼+成品。采集360可看全網(wǎng)vip影片
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 812 次瀏覽 ? 2020-08-22 18:54
源碼我更改成黑色的了。改動(dòng)比較大。但源碼只發(fā)布原版。需要自己改。數據手動(dòng)采集360影視,解析插口自己找。論壇不知道能不能發(fā)布插口。這次先不發(fā),后期單獨發(fā)一貼.各大平臺影片基本都能解下來(lái)
安裝須要虛擬空間安裝網(wǎng)站,注冊用戶(hù)。和對接APP驗證。
類(lèi)庫齊全
藍奏云下載地址
*********源碼在最下邊*************
這個(gè)程序修補了好多個(gè)BUG目前是沒(méi)有BUG的,而且都是可以看的,用的是內置瀏覽器播放器可以無(wú)視廣告,帶充值卡,充值卡后臺自己設置,自己定價(jià),自己決定充值卡的名子,帶一鍵分享功能和用戶(hù)中心功能,完全仿造原生主流APP而做,界面完美無(wú)錯!
?。蓲赍X(qián))影視app源碼可注冊登錄帶后臺,批量生成卡密在線(xiàn)授權可設置試看時(shí)間
?。蓲赍X(qián))影視app源碼帶后臺,批量生成卡密在線(xiàn)授權可設置試看時(shí)間,試看時(shí)間可以隨時(shí)修改,很方便,后臺可以直接管理用戶(hù)
支持批量生成卡密,用戶(hù)使用卡密可以直接授權
卡密的時(shí)間由你設定,收不收費你說(shuō)了算
可以設置綁定IP或則綁定機器碼,就是說(shuō)換了手機之前的帳號不能使用,防止一號多用
***************************************************
查看全部
[Android]橘子視頻。e4a源碼+成品。采集360可看全網(wǎng)vip影片
源碼我更改成黑色的了。改動(dòng)比較大。但源碼只發(fā)布原版。需要自己改。數據手動(dòng)采集360影視,解析插口自己找。論壇不知道能不能發(fā)布插口。這次先不發(fā),后期單獨發(fā)一貼.各大平臺影片基本都能解下來(lái)
安裝須要虛擬空間安裝網(wǎng)站,注冊用戶(hù)。和對接APP驗證。
類(lèi)庫齊全
藍奏云下載地址
*********源碼在最下邊*************
這個(gè)程序修補了好多個(gè)BUG目前是沒(méi)有BUG的,而且都是可以看的,用的是內置瀏覽器播放器可以無(wú)視廣告,帶充值卡,充值卡后臺自己設置,自己定價(jià),自己決定充值卡的名子,帶一鍵分享功能和用戶(hù)中心功能,完全仿造原生主流APP而做,界面完美無(wú)錯!
?。蓲赍X(qián))影視app源碼可注冊登錄帶后臺,批量生成卡密在線(xiàn)授權可設置試看時(shí)間
?。蓲赍X(qián))影視app源碼帶后臺,批量生成卡密在線(xiàn)授權可設置試看時(shí)間,試看時(shí)間可以隨時(shí)修改,很方便,后臺可以直接管理用戶(hù)
支持批量生成卡密,用戶(hù)使用卡密可以直接授權
卡密的時(shí)間由你設定,收不收費你說(shuō)了算
可以設置綁定IP或則綁定機器碼,就是說(shuō)換了手機之前的帳號不能使用,防止一號多用
***************************************************

[雜談]關(guān)于報刀機器人是手動(dòng)搜集刀數嗎?(不做了,被團扇亂殺)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 189 次瀏覽 ? 2020-08-22 15:21
2020-07-01 19:42
[雜談]關(guān)于報刀機器人是手動(dòng)搜集刀數嗎?(不做了,被團扇亂殺)
就是會(huì )里打了boss,機器人就手動(dòng)記錄誰(shuí)誰(shuí)出了第幾刀,傷害多少。 還是須要會(huì )員自己去群里報刀?[s:ac:暈]
如果是自己去報刀,那捉魚(yú)的不捉魚(yú)的不是就全靠自覺(jué)了嘛。[s:ac:呆]
現在可以做到爬取游戲里的實(shí)時(shí)數據嗎?最近想試試自己搭個(gè)機器人。主要是為了那個(gè)但求每晚出滿(mǎn)三刀幫會(huì )用的。[s:ac:哭笑]
補充:主要啊[s:ac:擦汗]咸魚(yú)幫會(huì )只有每晚出滿(mǎn)三刀這個(gè)要求,1w開(kāi)外那個(gè),昨天9點(diǎn)多了還有7個(gè)人沒(méi)出刀,大家出沒(méi)出滿(mǎn)3刀也不清楚,作為會(huì )長(cháng)我就只有自己用紙筆逐個(gè)記錄對比,看看誰(shuí)誰(shuí)沒(méi)打,沒(méi)出刀,怪累的,才想問(wèn)問(wèn)的,看來(lái)實(shí)現上去還是有點(diǎn)困難[s:a2:不活了]
不過(guò)我還是先試試吧,明天再改改
好吧,基本做出來(lái)了[s:ac:擦汗]不過(guò)還是有很多麻煩,等會(huì )我發(fā)圖瞧瞧療效
2020.7.3更新目前實(shí)現了對截圖的數據進(jìn)行剖析,俗話(huà)說(shuō)小數據剖析[s:ac:哭笑]
分離提純我們須要的信息,然后寫(xiě)入數據庫篩選,最后再輸出
這個(gè)是截圖保存位置,目前實(shí)現了手動(dòng)截圖,也就是說(shuō)只要號仍然在線(xiàn)視奸,然后定時(shí)或則主動(dòng)截圖,程序都會(huì )辨識讀取
這個(gè)是輸出,就詳盡的篩選了玩家名子和對應的出刀次數
其實(shí)數據庫的話(huà),是記錄了boss和傷害的,但是俺們休閑幫會(huì )用不上,就沒(méi)必要輸出了[s:ac:哭笑](休閑幫會(huì )傷害是真的不能看)
功能的話(huà)基本上實(shí)現了,只是要正常運作的話(huà)難度還是很大了,首先得保證有號仍然在線(xiàn)而且在工會(huì )戰頁(yè)面,就這一個(gè)條件就太嚴苛了
只要這個(gè)條件能達成的話(huà),其他都不是事了,配合QQ機器人,定時(shí)截圖或則發(fā)送QQ信息截圖,然后統計信息就很簡(jiǎn)單了
只能說(shuō)有看法,但不成熟啊[s:ac:冷]附件
附件改動(dòng) 查看全部
[雜談]關(guān)于報刀機器人是手動(dòng)搜集刀數嗎?(不做了,被團扇亂殺)
2020-07-01 19:42
[雜談]關(guān)于報刀機器人是手動(dòng)搜集刀數嗎?(不做了,被團扇亂殺)
就是會(huì )里打了boss,機器人就手動(dòng)記錄誰(shuí)誰(shuí)出了第幾刀,傷害多少。 還是須要會(huì )員自己去群里報刀?[s:ac:暈]
如果是自己去報刀,那捉魚(yú)的不捉魚(yú)的不是就全靠自覺(jué)了嘛。[s:ac:呆]
現在可以做到爬取游戲里的實(shí)時(shí)數據嗎?最近想試試自己搭個(gè)機器人。主要是為了那個(gè)但求每晚出滿(mǎn)三刀幫會(huì )用的。[s:ac:哭笑]
補充:主要啊[s:ac:擦汗]咸魚(yú)幫會(huì )只有每晚出滿(mǎn)三刀這個(gè)要求,1w開(kāi)外那個(gè),昨天9點(diǎn)多了還有7個(gè)人沒(méi)出刀,大家出沒(méi)出滿(mǎn)3刀也不清楚,作為會(huì )長(cháng)我就只有自己用紙筆逐個(gè)記錄對比,看看誰(shuí)誰(shuí)沒(méi)打,沒(méi)出刀,怪累的,才想問(wèn)問(wèn)的,看來(lái)實(shí)現上去還是有點(diǎn)困難[s:a2:不活了]
不過(guò)我還是先試試吧,明天再改改
好吧,基本做出來(lái)了[s:ac:擦汗]不過(guò)還是有很多麻煩,等會(huì )我發(fā)圖瞧瞧療效
2020.7.3更新目前實(shí)現了對截圖的數據進(jìn)行剖析,俗話(huà)說(shuō)小數據剖析[s:ac:哭笑]
分離提純我們須要的信息,然后寫(xiě)入數據庫篩選,最后再輸出
這個(gè)是截圖保存位置,目前實(shí)現了手動(dòng)截圖,也就是說(shuō)只要號仍然在線(xiàn)視奸,然后定時(shí)或則主動(dòng)截圖,程序都會(huì )辨識讀取
這個(gè)是輸出,就詳盡的篩選了玩家名子和對應的出刀次數
其實(shí)數據庫的話(huà),是記錄了boss和傷害的,但是俺們休閑幫會(huì )用不上,就沒(méi)必要輸出了[s:ac:哭笑](休閑幫會(huì )傷害是真的不能看)
功能的話(huà)基本上實(shí)現了,只是要正常運作的話(huà)難度還是很大了,首先得保證有號仍然在線(xiàn)而且在工會(huì )戰頁(yè)面,就這一個(gè)條件就太嚴苛了
只要這個(gè)條件能達成的話(huà),其他都不是事了,配合QQ機器人,定時(shí)截圖或則發(fā)送QQ信息截圖,然后統計信息就很簡(jiǎn)單了
只能說(shuō)有看法,但不成熟啊[s:ac:冷]附件



附件改動(dòng)
【web系統UI自動(dòng)化】關(guān)于UI自動(dòng)化的總結
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 257 次瀏覽 ? 2020-08-22 12:44
實(shí)施過(guò)了web系統的UI自動(dòng)化,回顧梳理下,想到哪些寫(xiě)哪些,隨時(shí)補充。
首先,自動(dòng)化測試不是自動(dòng)測試的替代品,是比較好的補充,而且不是占大比重的補充。
70%的測試工作集中在底層接口測試和單元測試,20%的測試工作為集成測試,其他10%的測試即為界面測試。
開(kāi)發(fā)方向:盡可能的相通的模塊,通用的封裝開(kāi)發(fā)約定好,便于定位適用兼容測試無(wú)界面運行快速定位問(wèn)題:報錯信息、錯誤截圖多環(huán)境利潤點(diǎn)腳本開(kāi)發(fā)時(shí)間和復用次數快速驗證,第一時(shí)間響應問(wèn)題還可以做什么?兼容性多環(huán)境以便快速定位提煉更多通用模塊。調研更優(yōu)解決方案,比如:cypress等case依賴(lài)優(yōu)化深度校準什么樣的項目適宜web自動(dòng)化系統穩定,太多的制止程序或修改。準備之前,先手工測試,確認手動(dòng)測試可以囊括的系統功能。需要多系統,多瀏覽器兼容性測試什么樣的功能點(diǎn)須要web自動(dòng)化主業(yè)務(wù)流程便于實(shí)現自動(dòng)化的web元素、頁(yè)面重復量大的功能web自動(dòng)化常見(jiàn)的驗證點(diǎn)頁(yè)面元素驗證頁(yè)面列表數據驗證頁(yè)面元素屬性?UI的文本,圖片顯示正確性UI的交互邏輯正確性測試UI上的用戶(hù)行為正確性測試對于web自動(dòng)化框架常見(jiàn)的需求點(diǎn)分布式執行,可以多機器,多瀏覽器同步執行腳本適用于不同環(huán)境運行分層設計,方便維護生成測試報告模塊的復用必要的日志采集UI自動(dòng)化利潤點(diǎn)的采集回歸測試須要定期運行,在自動(dòng)化時(shí),它們可以節約測試人員的時(shí)間,我們可以更專(zhuān)注于其他場(chǎng)景和探索性測試。腳本開(kāi)發(fā)時(shí)間和復用次數誤報頻度UI自動(dòng)化缺點(diǎn)or局限不能快速反饋(相對于單元測試和API測試)只會(huì )對于case已確定的內容進(jìn)行校準運行的穩定性發(fā)覺(jué)的錯誤不多,大多數錯誤其實(shí)是通過(guò)“意外”或進(jìn)行探索性測試而發(fā)覺(jué)的。這可能是因為在每位探索性測試會(huì )話(huà)期間,我們可能以不同的方法測試應用程序,從而通過(guò)應用程序找到新的漏洞。編寫(xiě)優(yōu)秀且穩定的XPath / CSS定位器所耗費的時(shí)間,并在底層HTML標記發(fā)生變化時(shí)更新它們。UI本身的變化性,要想達到和手工測試相同的覆蓋率,投入比較大。如何進(jìn)行CI(Continuous Integration),也就是持續集成
● 持續提交代碼 (Check-in)
○ 一天之中多次提交
● 持續構建代碼 (Build)
○ 保證在任何時(shí)刻代碼是可以繼續開(kāi)發(fā)的
● 持續部署代碼 (Deploy)
○ 保證始終有一個(gè)可以部署的版本
● 持續測試代碼 (Test)
○ 每次提交均執行單元測試
○ 每天一次或數次集成測試
○ 每天一次或數次系統測試
不過(guò),高頻的集成,還是用插口愈發(fā)合適,后面的工作會(huì )把系統的交互插口自動(dòng)化,屆時(shí)分享。 查看全部
【web系統UI自動(dòng)化】關(guān)于UI自動(dòng)化的總結

實(shí)施過(guò)了web系統的UI自動(dòng)化,回顧梳理下,想到哪些寫(xiě)哪些,隨時(shí)補充。
首先,自動(dòng)化測試不是自動(dòng)測試的替代品,是比較好的補充,而且不是占大比重的補充。
70%的測試工作集中在底層接口測試和單元測試,20%的測試工作為集成測試,其他10%的測試即為界面測試。
開(kāi)發(fā)方向:盡可能的相通的模塊,通用的封裝開(kāi)發(fā)約定好,便于定位適用兼容測試無(wú)界面運行快速定位問(wèn)題:報錯信息、錯誤截圖多環(huán)境利潤點(diǎn)腳本開(kāi)發(fā)時(shí)間和復用次數快速驗證,第一時(shí)間響應問(wèn)題還可以做什么?兼容性多環(huán)境以便快速定位提煉更多通用模塊。調研更優(yōu)解決方案,比如:cypress等case依賴(lài)優(yōu)化深度校準什么樣的項目適宜web自動(dòng)化系統穩定,太多的制止程序或修改。準備之前,先手工測試,確認手動(dòng)測試可以囊括的系統功能。需要多系統,多瀏覽器兼容性測試什么樣的功能點(diǎn)須要web自動(dòng)化主業(yè)務(wù)流程便于實(shí)現自動(dòng)化的web元素、頁(yè)面重復量大的功能web自動(dòng)化常見(jiàn)的驗證點(diǎn)頁(yè)面元素驗證頁(yè)面列表數據驗證頁(yè)面元素屬性?UI的文本,圖片顯示正確性UI的交互邏輯正確性測試UI上的用戶(hù)行為正確性測試對于web自動(dòng)化框架常見(jiàn)的需求點(diǎn)分布式執行,可以多機器,多瀏覽器同步執行腳本適用于不同環(huán)境運行分層設計,方便維護生成測試報告模塊的復用必要的日志采集UI自動(dòng)化利潤點(diǎn)的采集回歸測試須要定期運行,在自動(dòng)化時(shí),它們可以節約測試人員的時(shí)間,我們可以更專(zhuān)注于其他場(chǎng)景和探索性測試。腳本開(kāi)發(fā)時(shí)間和復用次數誤報頻度UI自動(dòng)化缺點(diǎn)or局限不能快速反饋(相對于單元測試和API測試)只會(huì )對于case已確定的內容進(jìn)行校準運行的穩定性發(fā)覺(jué)的錯誤不多,大多數錯誤其實(shí)是通過(guò)“意外”或進(jìn)行探索性測試而發(fā)覺(jué)的。這可能是因為在每位探索性測試會(huì )話(huà)期間,我們可能以不同的方法測試應用程序,從而通過(guò)應用程序找到新的漏洞。編寫(xiě)優(yōu)秀且穩定的XPath / CSS定位器所耗費的時(shí)間,并在底層HTML標記發(fā)生變化時(shí)更新它們。UI本身的變化性,要想達到和手工測試相同的覆蓋率,投入比較大。如何進(jìn)行CI(Continuous Integration),也就是持續集成
● 持續提交代碼 (Check-in)
○ 一天之中多次提交
● 持續構建代碼 (Build)
○ 保證在任何時(shí)刻代碼是可以繼續開(kāi)發(fā)的
● 持續部署代碼 (Deploy)
○ 保證始終有一個(gè)可以部署的版本
● 持續測試代碼 (Test)
○ 每次提交均執行單元測試
○ 每天一次或數次集成測試
○ 每天一次或數次系統測試
不過(guò),高頻的集成,還是用插口愈發(fā)合適,后面的工作會(huì )把系統的交互插口自動(dòng)化,屆時(shí)分享。
用Python爬蟲(chóng)實(shí)現圖片手動(dòng)下載的方式
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 238 次瀏覽 ? 2020-08-21 18:12
爬蟲(chóng)的出現,可以乘以許多重復性的工作,在須要大量采集數據時(shí),爬蟲(chóng)可以實(shí)現手動(dòng)下載,極大的提升了工作效率。那么python如何實(shí)現圖片手動(dòng)下載的呢?如何借助python寫(xiě)爬蟲(chóng)?本文為你們介紹了用Python爬蟲(chóng)實(shí)現圖片手動(dòng)下載的方式。
1.分析需求
比如上百度找圖片,可以通過(guò)搜索功能,查找圖片后,選中其中一個(gè)查看源代碼,找到圖片對應的源代碼,如果圖片多地址,比如有thumbURL,middleURL,hoverURL,objURL,分別打開(kāi)看那個(gè)圖片符合需求。如果objURL符合需求,格式為.jpg。
2.選擇python庫
選擇2個(gè)包,一個(gè)是正則,一個(gè)是requests包。
3.編寫(xiě)代碼
復制百度圖片搜索的鏈接,傳入requests,然后把正則表達式寫(xiě)好。
因為有很多張圖片,所以要循環(huán),我們復印出結果來(lái)瞧瞧,然后用requests獲取網(wǎng)址,由于有些圖片可能存在網(wǎng)址打不開(kāi)的情況,所以加了10秒超時(shí)控制。
4.圖片保存
建立好一個(gè)images目錄,把圖片都放進(jìn)去,命名的時(shí)侯,以數字命名。
python如何實(shí)現圖片手動(dòng)下載??jì)H須要進(jìn)行四步,即可編撰好python爬蟲(chóng)并實(shí)現圖片手動(dòng)下載。學(xué)習爬蟲(chóng)簡(jiǎn)單吧,即使是菜鳥(niǎo),也能特別快的上手呢。
能夠成功實(shí)現手動(dòng)下載也千萬(wàn)不大意,說(shuō)不定就遇上了反爬蟲(chóng)機制,記得使用IP池突破限制,比如使用黑洞代理。 查看全部
用Python爬蟲(chóng)實(shí)現圖片手動(dòng)下載的方式
爬蟲(chóng)的出現,可以乘以許多重復性的工作,在須要大量采集數據時(shí),爬蟲(chóng)可以實(shí)現手動(dòng)下載,極大的提升了工作效率。那么python如何實(shí)現圖片手動(dòng)下載的呢?如何借助python寫(xiě)爬蟲(chóng)?本文為你們介紹了用Python爬蟲(chóng)實(shí)現圖片手動(dòng)下載的方式。
1.分析需求
比如上百度找圖片,可以通過(guò)搜索功能,查找圖片后,選中其中一個(gè)查看源代碼,找到圖片對應的源代碼,如果圖片多地址,比如有thumbURL,middleURL,hoverURL,objURL,分別打開(kāi)看那個(gè)圖片符合需求。如果objURL符合需求,格式為.jpg。
2.選擇python庫
選擇2個(gè)包,一個(gè)是正則,一個(gè)是requests包。
3.編寫(xiě)代碼
復制百度圖片搜索的鏈接,傳入requests,然后把正則表達式寫(xiě)好。
因為有很多張圖片,所以要循環(huán),我們復印出結果來(lái)瞧瞧,然后用requests獲取網(wǎng)址,由于有些圖片可能存在網(wǎng)址打不開(kāi)的情況,所以加了10秒超時(shí)控制。

4.圖片保存
建立好一個(gè)images目錄,把圖片都放進(jìn)去,命名的時(shí)侯,以數字命名。


python如何實(shí)現圖片手動(dòng)下載??jì)H須要進(jìn)行四步,即可編撰好python爬蟲(chóng)并實(shí)現圖片手動(dòng)下載。學(xué)習爬蟲(chóng)簡(jiǎn)單吧,即使是菜鳥(niǎo),也能特別快的上手呢。
能夠成功實(shí)現手動(dòng)下載也千萬(wàn)不大意,說(shuō)不定就遇上了反爬蟲(chóng)機制,記得使用IP池突破限制,比如使用黑洞代理。
詳解基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 390 次瀏覽 ? 2020-08-21 05:06
詳解基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰
更新時(shí)間:2020年08月20日 10:31:19 轉載投稿:zx
這篇文章主要介紹了解讀基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰,文中通過(guò)示例代碼介紹的十分詳盡,對你們的學(xué)習或則工作具有一定的參考學(xué)習價(jià)值,需要的朋友們下邊隨著(zhù)小編來(lái)一起學(xué)習學(xué)習吧
1.Appium
Appium是一個(gè)開(kāi)源測試自動(dòng)化框架,可用于原生,混合和聯(lián)通Web應用程序測試, 它使用WebDriver合同驅動(dòng)iOS,Android和Windows應用程序。
通過(guò)Appium,我們可以模擬點(diǎn)擊和屏幕的滑動(dòng),可以獲取元素的id和classname,還可以依照操作生成相關(guān)的腳本代碼。
下面開(kāi)始Appium的配置。
appPackage和APPActivity的獲取
任意下載一個(gè)app
解壓
但是解壓下來(lái)的xml文件可能是亂碼,所以我們須要反編譯文件。
逆向AndroidManifest.xml
下載AXMLPrinter2.jar文件,逆向xml文件:命令行輸入以下命令:
java -jar AXMLPrinter2.jar AndroidManifest.xml ->AndroidManifest.txt
獲得以下可以查看的TXT文件
尋找帶有launcher 的Activity
尋找manifest上面的package
Devicename的獲取
通過(guò)命令行輸入 adb devices:
appium的功能介紹
下面將按照上圖序號一一介紹功能:
選中界面元素,顯示元素相關(guān)信息
模擬滑動(dòng)屏幕,先點(diǎn)擊一下代表觸摸起始位置,在點(diǎn)擊一下代表觸摸結束為止
模擬點(diǎn)擊屏幕
模擬手機的返回按鍵
刷新一側的頁(yè)面,使之與手機同步
記錄模擬操作,生成相關(guān)腳本
根據元素的id或則其他相關(guān)信息查找元素
復制當前界面的xml布局
文件退出
2.Python的腳本
元素定位的使用
(1).xpath定位
xpath定位是一種路徑定位方法,主要是依賴(lài)于元素絕對路徑或則相關(guān)屬性來(lái)定位,但是絕對路徑xpath執行效率比較低(特別是元素路徑比較深的時(shí)侯),一般使用比較少。
通常使用xpath相對路徑和屬性定位。
by_xpath.py
from find_element.capability import driver
driver.find_element_by_xpath('//android.widget.EditText[@text="請輸入用戶(hù)名"]').send_keys('123456')
driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="3"]').send_keys('123456')
driver.find_element_by_xpath('//android.widget.Button').click()
driver.find_element_by_xpath('//[@class="android.widget.Button"]').click()
(2).classname定位
classname定位是依據元素類(lèi)型來(lái)進(jìn)行定位,但是實(shí)際情況中好多元素的classname都是相同的,
如用戶(hù)名和密碼都是clasName屬性值都是:“android.widget.EditText” 因此只能定位第一個(gè)元素也就是用戶(hù)名,而密碼輸入框就須要使用其他方法來(lái)定位,這樣也許太雞肋.一般情況下假如有id就毋須使用classname定位。
by_classname.py
from find_element.capability import driver
driver.find_element_by_class_name('android.widget.EditText').send_keys('123565')
driver.find_element_by_class_name('android.widget.EditText').send_keys('456879')
driver.find_element_by_class_name('android.widget.Button').click()
(3).id定位
日常生活中身邊可能存在相同名子的人,但是每位人的身份證號碼是惟一的,在app界面元素中也可以使用id值來(lái)分辨不同的元素,然后進(jìn)行定位操作。
Appium中可以使用 find_element_by_id() 方法來(lái)進(jìn)行id定位。
driver.find_element_by_id('android:id/button2').click()
driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
3.示例:模擬軟件的手動(dòng)注冊
首先配置聯(lián)接屬性
desired_caps={}
# 所使用的平臺
desired_caps['platformName']='Android'
# 所使用的手機的名字 可以通過(guò) adb devices 獲得
desired_caps['deviceName']='127.0.0.1:62001'
# ANDROID 的版本
desired_caps['platforVersion']='5.1.1'
# app 的路徑
desired_caps['app']=r'D:\extend\kaoyanbang.apk'
# app的包名
desired_caps['appPackage']='com.tal.kaoyan'
# app 加載頁(yè)面
desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
# 設置每次是否清除數據
desired_caps['noReset']='False'
# 是否使用unicode鍵盤(pán)輸入,在輸入中文字符和unicode字符時(shí)設置為true
desired_caps['unicodeKeyboard']="True"
# 是否將鍵盤(pán)重置為初始狀態(tài),設置了unicodeKeyboard時(shí),在測試完成后,設置為true,將鍵盤(pán)重置
desired_caps['resetKeyboard']="True"
# appium服務(wù)器的連接地址
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(2)
編寫(xiě)操作腳本
import random
import time
driver.find_element_by_id('com.tal.kaoyan:id/login_register_text').click()
username='zx2019'+'F2LY'+str(random.randint(1000,9000))
print('username: %s' %username)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_username_edittext').send_keys(username)
password='zxw2018'+str(random.randint(1000,9000))
print('password: %s' %password)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_password_edittext').send_keys(password)
email='51zxw'+str(random.randint(1000,9000))+'@163.com'
print('email: %s' %email)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_email_edittext').send_keys(email)
#點(diǎn)擊進(jìn)入考研幫
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_register_btn').click()
#專(zhuān)業(yè)選擇
driver.find_element_by_id('com.tal.kaoyan:id/activity_perfectinfomation_major').click()
driver.find_elements_by_id('com.tal.kaoyan:id/major_subject_title')[1].click()
driver.find_elements_by_id('com.tal.kaoyan:id/major_group_title')[2].click()
driver.find_elements_by_id('com.tal.kaoyan:id/major_search_item_name')[1].click()
#院校選擇
driver.find_element_by_id('com.tal.kaoyan:id/activity_perfectinfomation_school').click()
driver.tap([(182,1557),])
driver.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/android.widget.'
'RelativeLayout/android.widget.ExpandableListView/android.widget.'
'LinearLayout[1]/android.widget.TextView[1]').click()
driver.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/'
'android.widget.RelativeLayout/android.widget.ExpandableListView/'
'android.widget.LinearLayout[4]/android.widget.TextView').click()
time.sleep(2)
driver.tap([(983,1354),])
# driver.find_elements_by_id('com.tal.kaoyan:id/more_forum_title')[1].click()
# driver.find_elements_by_id('com.tal.kaoyan:id/university_search_item_name')[1].click()
driver.find_element_by_id('com.tal.kaoyan:id/activity_perfectinfomation_goBtn').click()
print('注冊成功')
到此這篇關(guān)于解讀基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰的文章就介紹到這了,更多相關(guān)Android的Appium+Python自動(dòng)化腳本內容請搜索腳本之家先前的文章或繼續瀏覽下邊的相關(guān)文章希望你們之后多多支持腳本之家! 查看全部
詳解基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰
詳解基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰
更新時(shí)間:2020年08月20日 10:31:19 轉載投稿:zx
這篇文章主要介紹了解讀基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰,文中通過(guò)示例代碼介紹的十分詳盡,對你們的學(xué)習或則工作具有一定的參考學(xué)習價(jià)值,需要的朋友們下邊隨著(zhù)小編來(lái)一起學(xué)習學(xué)習吧
1.Appium
Appium是一個(gè)開(kāi)源測試自動(dòng)化框架,可用于原生,混合和聯(lián)通Web應用程序測試, 它使用WebDriver合同驅動(dòng)iOS,Android和Windows應用程序。
通過(guò)Appium,我們可以模擬點(diǎn)擊和屏幕的滑動(dòng),可以獲取元素的id和classname,還可以依照操作生成相關(guān)的腳本代碼。
下面開(kāi)始Appium的配置。

appPackage和APPActivity的獲取
任意下載一個(gè)app
解壓

但是解壓下來(lái)的xml文件可能是亂碼,所以我們須要反編譯文件。
逆向AndroidManifest.xml
下載AXMLPrinter2.jar文件,逆向xml文件:命令行輸入以下命令:
java -jar AXMLPrinter2.jar AndroidManifest.xml ->AndroidManifest.txt
獲得以下可以查看的TXT文件

尋找帶有launcher 的Activity

尋找manifest上面的package

Devicename的獲取
通過(guò)命令行輸入 adb devices:

appium的功能介紹


下面將按照上圖序號一一介紹功能:
選中界面元素,顯示元素相關(guān)信息

模擬滑動(dòng)屏幕,先點(diǎn)擊一下代表觸摸起始位置,在點(diǎn)擊一下代表觸摸結束為止
模擬點(diǎn)擊屏幕
模擬手機的返回按鍵
刷新一側的頁(yè)面,使之與手機同步
記錄模擬操作,生成相關(guān)腳本

根據元素的id或則其他相關(guān)信息查找元素

復制當前界面的xml布局
文件退出
2.Python的腳本
元素定位的使用
(1).xpath定位
xpath定位是一種路徑定位方法,主要是依賴(lài)于元素絕對路徑或則相關(guān)屬性來(lái)定位,但是絕對路徑xpath執行效率比較低(特別是元素路徑比較深的時(shí)侯),一般使用比較少。
通常使用xpath相對路徑和屬性定位。
by_xpath.py
from find_element.capability import driver
driver.find_element_by_xpath('//android.widget.EditText[@text="請輸入用戶(hù)名"]').send_keys('123456')
driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="3"]').send_keys('123456')
driver.find_element_by_xpath('//android.widget.Button').click()
driver.find_element_by_xpath('//[@class="android.widget.Button"]').click()
(2).classname定位
classname定位是依據元素類(lèi)型來(lái)進(jìn)行定位,但是實(shí)際情況中好多元素的classname都是相同的,
如用戶(hù)名和密碼都是clasName屬性值都是:“android.widget.EditText” 因此只能定位第一個(gè)元素也就是用戶(hù)名,而密碼輸入框就須要使用其他方法來(lái)定位,這樣也許太雞肋.一般情況下假如有id就毋須使用classname定位。
by_classname.py
from find_element.capability import driver
driver.find_element_by_class_name('android.widget.EditText').send_keys('123565')
driver.find_element_by_class_name('android.widget.EditText').send_keys('456879')
driver.find_element_by_class_name('android.widget.Button').click()
(3).id定位
日常生活中身邊可能存在相同名子的人,但是每位人的身份證號碼是惟一的,在app界面元素中也可以使用id值來(lái)分辨不同的元素,然后進(jìn)行定位操作。
Appium中可以使用 find_element_by_id() 方法來(lái)進(jìn)行id定位。
driver.find_element_by_id('android:id/button2').click()
driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
3.示例:模擬軟件的手動(dòng)注冊
首先配置聯(lián)接屬性
desired_caps={}
# 所使用的平臺
desired_caps['platformName']='Android'
# 所使用的手機的名字 可以通過(guò) adb devices 獲得
desired_caps['deviceName']='127.0.0.1:62001'
# ANDROID 的版本
desired_caps['platforVersion']='5.1.1'
# app 的路徑
desired_caps['app']=r'D:\extend\kaoyanbang.apk'
# app的包名
desired_caps['appPackage']='com.tal.kaoyan'
# app 加載頁(yè)面
desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
# 設置每次是否清除數據
desired_caps['noReset']='False'
# 是否使用unicode鍵盤(pán)輸入,在輸入中文字符和unicode字符時(shí)設置為true
desired_caps['unicodeKeyboard']="True"
# 是否將鍵盤(pán)重置為初始狀態(tài),設置了unicodeKeyboard時(shí),在測試完成后,設置為true,將鍵盤(pán)重置
desired_caps['resetKeyboard']="True"
# appium服務(wù)器的連接地址
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(2)
編寫(xiě)操作腳本
import random
import time
driver.find_element_by_id('com.tal.kaoyan:id/login_register_text').click()
username='zx2019'+'F2LY'+str(random.randint(1000,9000))
print('username: %s' %username)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_username_edittext').send_keys(username)
password='zxw2018'+str(random.randint(1000,9000))
print('password: %s' %password)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_password_edittext').send_keys(password)
email='51zxw'+str(random.randint(1000,9000))+'@163.com'
print('email: %s' %email)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_email_edittext').send_keys(email)
#點(diǎn)擊進(jìn)入考研幫
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_register_btn').click()
#專(zhuān)業(yè)選擇
driver.find_element_by_id('com.tal.kaoyan:id/activity_perfectinfomation_major').click()
driver.find_elements_by_id('com.tal.kaoyan:id/major_subject_title')[1].click()
driver.find_elements_by_id('com.tal.kaoyan:id/major_group_title')[2].click()
driver.find_elements_by_id('com.tal.kaoyan:id/major_search_item_name')[1].click()
#院校選擇
driver.find_element_by_id('com.tal.kaoyan:id/activity_perfectinfomation_school').click()
driver.tap([(182,1557),])
driver.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/android.widget.'
'RelativeLayout/android.widget.ExpandableListView/android.widget.'
'LinearLayout[1]/android.widget.TextView[1]').click()
driver.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/'
'android.widget.RelativeLayout/android.widget.ExpandableListView/'
'android.widget.LinearLayout[4]/android.widget.TextView').click()
time.sleep(2)
driver.tap([(983,1354),])
# driver.find_elements_by_id('com.tal.kaoyan:id/more_forum_title')[1].click()
# driver.find_elements_by_id('com.tal.kaoyan:id/university_search_item_name')[1].click()
driver.find_element_by_id('com.tal.kaoyan:id/activity_perfectinfomation_goBtn').click()
print('注冊成功')
到此這篇關(guān)于解讀基于A(yíng)ndroid的Appium+Python自動(dòng)化腳本編撰的文章就介紹到這了,更多相關(guān)Android的Appium+Python自動(dòng)化腳本內容請搜索腳本之家先前的文章或繼續瀏覽下邊的相關(guān)文章希望你們之后多多支持腳本之家!
使用Shell編撰定時(shí)向指定API獲取數據的腳本
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 220 次瀏覽 ? 2020-08-20 18:32
場(chǎng)景:這個(gè)在服務(wù)器上寫(xiě)定時(shí)腳本的情況十分多,比如每晚向定時(shí)往用戶(hù)推送相關(guān)信息,定時(shí)清除相關(guān)數據,定時(shí)短信提醒等等。
本文的場(chǎng)景是采用shell定時(shí)向指定開(kāi)放API獲取數據。
本文使用的是crontab,可以先在終端查看是開(kāi)啟此服務(wù),命令如下:
yang@master:~$ sudo service cron status
[sudo] password for yang:
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: ena
Active: active (running) since Sat 2016-08-13 08:29:16 CST; 30min ago
Docs: man:cron(8)
Main PID: 831 (cron)
CGroup: /system.slice/cron.service
└─831 /usr/sbin/cron -f
Aug 13 08:29:16 master systemd[1]: Started Regular background program processing
Aug 13 08:29:16 master cron[831]: (CRON) INFO (pidfile fd = 3)
Aug 13 08:29:16 master cron[831]: (CRON) INFO (Running @reboot jobs)
編寫(xiě)定時(shí)腳本
這個(gè)腳本是我們要定時(shí)器定時(shí)執行的任務(wù),即我們要定時(shí)做什么,在這里,我是要使腳本手動(dòng)采集數據,腳本如下:
#!/usr/bin/env bash
path_log="fetch_data.log"
path_stuTenSch="http://www.google.com"
code_success="200"
#get http response code
http_code=$(curl -s -o /dev/null -I -w "%{http_code}" $path_stuTenSch)
#echo "$http_code" >> $path_log
if [ "$http_code"==$code_success ]; then
echo "Status Code:$http_code, success, Resquest URL: $path_stuTenSch" >> $path_log
echo "starting..........." >> $path_log
curl $path_stuTenSch > /home/hadoop/tmp_data/users.json
echo "end----------------" >> $path_log
else
echo "Status Code:$http_code, fail, Resquest URL: $path_stuTenSch" >> $path_log
fi
編輯crontab
編輯crontab是用crontab -e執行,crontab -l來(lái)顯示有什么定時(shí)器。每個(gè)定時(shí)器用一行來(lái)表示。通常情況下,有6個(gè)參數,分別為分鐘,小時(shí),天,月,周,要執行的命令,*表示任意時(shí)間,/n表示每隔n的時(shí)間進(jìn)行重復。
yang@master:~$ crontab -e
*/1 * * * * /home/yang/shell/fetch_data.sh
在這里,我是每隔一分鐘執行一次sh腳本。 查看全部
使用Shell編撰定時(shí)向指定API獲取數據的腳本
場(chǎng)景:這個(gè)在服務(wù)器上寫(xiě)定時(shí)腳本的情況十分多,比如每晚向定時(shí)往用戶(hù)推送相關(guān)信息,定時(shí)清除相關(guān)數據,定時(shí)短信提醒等等。
本文的場(chǎng)景是采用shell定時(shí)向指定開(kāi)放API獲取數據。
本文使用的是crontab,可以先在終端查看是開(kāi)啟此服務(wù),命令如下:
yang@master:~$ sudo service cron status
[sudo] password for yang:
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: ena
Active: active (running) since Sat 2016-08-13 08:29:16 CST; 30min ago
Docs: man:cron(8)
Main PID: 831 (cron)
CGroup: /system.slice/cron.service
└─831 /usr/sbin/cron -f
Aug 13 08:29:16 master systemd[1]: Started Regular background program processing
Aug 13 08:29:16 master cron[831]: (CRON) INFO (pidfile fd = 3)
Aug 13 08:29:16 master cron[831]: (CRON) INFO (Running @reboot jobs)
編寫(xiě)定時(shí)腳本
這個(gè)腳本是我們要定時(shí)器定時(shí)執行的任務(wù),即我們要定時(shí)做什么,在這里,我是要使腳本手動(dòng)采集數據,腳本如下:
#!/usr/bin/env bash
path_log="fetch_data.log"
path_stuTenSch="http://www.google.com"
code_success="200"
#get http response code
http_code=$(curl -s -o /dev/null -I -w "%{http_code}" $path_stuTenSch)
#echo "$http_code" >> $path_log
if [ "$http_code"==$code_success ]; then
echo "Status Code:$http_code, success, Resquest URL: $path_stuTenSch" >> $path_log
echo "starting..........." >> $path_log
curl $path_stuTenSch > /home/hadoop/tmp_data/users.json
echo "end----------------" >> $path_log
else
echo "Status Code:$http_code, fail, Resquest URL: $path_stuTenSch" >> $path_log
fi
編輯crontab
編輯crontab是用crontab -e執行,crontab -l來(lái)顯示有什么定時(shí)器。每個(gè)定時(shí)器用一行來(lái)表示。通常情況下,有6個(gè)參數,分別為分鐘,小時(shí),天,月,周,要執行的命令,*表示任意時(shí)間,/n表示每隔n的時(shí)間進(jìn)行重復。
yang@master:~$ crontab -e
*/1 * * * * /home/yang/shell/fetch_data.sh
在這里,我是每隔一分鐘執行一次sh腳本。
自己編撰網(wǎng)站防采集程序
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 327 次瀏覽 ? 2020-08-20 18:15
對于我們這些數據量很大的網(wǎng)站,面臨的一個(gè)麻煩是總有人來(lái)采集,以前多使用過(guò)人工檢測、屏蔽的辦法,這種辦法有療效但很費精力,前段時(shí)間也找了插件來(lái)自動(dòng)限制最大連接數,但存在誤屏蔽搜索引擎的問(wèn)題,最近老朽下決定親自操刀寫(xiě)程序,把那些采集器都斬草除根,雖然編程麻煩但效果好。
思路是在Drupal的模板文件中嵌入PHP程序代碼,讀取$_SERVER參數并記錄到數據庫中,通過(guò)對參數及訪(fǎng)問(wèn)頻度的判定來(lái)決定是否要訪(fǎng)問(wèn)者遞交驗證碼,如果驗證碼錯誤或則不填寫(xiě)的次數過(guò)多則屏蔽,可以通過(guò)host反向dns查找來(lái)判斷常見(jiàn)搜索引擎。
這個(gè)程序還稍稍有點(diǎn)復雜,以前更改開(kāi)源PHP程序都是直接上手,這個(gè)程序還編撰了流程圖,數據庫表結構也是自己規劃的,為了防止拉慢速率,MySQL中采用了Memory引擎,對于多是臨時(shí)訪(fǎng)問(wèn)記錄早已夠用了。程序寫(xiě)得太爛,就不放到博客中了。
這個(gè)程序anti-scraping.php上周調試了幾天,本周剛才投入試用,已經(jīng)可以從日志中見(jiàn)到療效,還須要不斷改進(jìn),例如降低黑名單、白名單、嘗試改用Drupal標準第三方模塊的形式等。因為完成采用自己編程實(shí)現,所以可以對判斷標準、屏蔽方法做各類(lèi)更改嘗試,應對各類(lèi)采集器。
版本歷史:
To Do List: 查看全部
自己編撰網(wǎng)站防采集程序
對于我們這些數據量很大的網(wǎng)站,面臨的一個(gè)麻煩是總有人來(lái)采集,以前多使用過(guò)人工檢測、屏蔽的辦法,這種辦法有療效但很費精力,前段時(shí)間也找了插件來(lái)自動(dòng)限制最大連接數,但存在誤屏蔽搜索引擎的問(wèn)題,最近老朽下決定親自操刀寫(xiě)程序,把那些采集器都斬草除根,雖然編程麻煩但效果好。
思路是在Drupal的模板文件中嵌入PHP程序代碼,讀取$_SERVER參數并記錄到數據庫中,通過(guò)對參數及訪(fǎng)問(wèn)頻度的判定來(lái)決定是否要訪(fǎng)問(wèn)者遞交驗證碼,如果驗證碼錯誤或則不填寫(xiě)的次數過(guò)多則屏蔽,可以通過(guò)host反向dns查找來(lái)判斷常見(jiàn)搜索引擎。
這個(gè)程序還稍稍有點(diǎn)復雜,以前更改開(kāi)源PHP程序都是直接上手,這個(gè)程序還編撰了流程圖,數據庫表結構也是自己規劃的,為了防止拉慢速率,MySQL中采用了Memory引擎,對于多是臨時(shí)訪(fǎng)問(wèn)記錄早已夠用了。程序寫(xiě)得太爛,就不放到博客中了。
這個(gè)程序anti-scraping.php上周調試了幾天,本周剛才投入試用,已經(jīng)可以從日志中見(jiàn)到療效,還須要不斷改進(jìn),例如降低黑名單、白名單、嘗試改用Drupal標準第三方模塊的形式等。因為完成采用自己編程實(shí)現,所以可以對判斷標準、屏蔽方法做各類(lèi)更改嘗試,應對各類(lèi)采集器。
版本歷史:
To Do List:
自動(dòng)采集編寫(xiě) 聊一聊爬蟲(chóng)那點(diǎn)事兒(一)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 492 次瀏覽 ? 2020-08-20 02:08
爬蟲(chóng)學(xué)習入門(mén)篇
作為一名程序員,大家對于爬蟲(chóng)這個(gè)詞的理解都有不同,我曾經(jīng)的理解就是一只spider在網(wǎng)路上爬取東西,不過(guò)我們能控制這只spider去爬取須要內容并存取到數據庫中。后來(lái)才發(fā)覺(jué)爬蟲(chóng)有點(diǎn)重要?。?!
網(wǎng)絡(luò )爬蟲(chóng)的介紹
在大數據時(shí)代,信息的采集是一項重要的工作,而互聯(lián)網(wǎng)中的數據是海量的,如果單純靠人力進(jìn)行信息采集,不僅低效繁雜,搜集的成本也會(huì )增強。如何手動(dòng)高效地獲取互聯(lián)網(wǎng)中我們感興趣的信息并為我們所用是一個(gè)重要的問(wèn)題,而爬蟲(chóng)技術(shù)就是為了解決這種問(wèn)題而生的。
網(wǎng)絡(luò )爬蟲(chóng)(Web crawler)也稱(chēng)作網(wǎng)路機器人,可以取代人們手動(dòng)地在互聯(lián)網(wǎng)中進(jìn)行數據信息的采集與整理。它是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本,可以手動(dòng)采集所有其才能訪(fǎng)問(wèn)到的頁(yè)面內容,以獲取相關(guān)數據。
從功能上來(lái)講,爬蟲(chóng)通常分為數據采集,處理,儲存三個(gè)部份。爬蟲(chóng)從一個(gè)或若干初始網(wǎng)頁(yè)的URL開(kāi)始,獲得初始網(wǎng)頁(yè)上的URL,在抓取網(wǎng)頁(yè)的過(guò)程中,不斷從當前頁(yè)面上抽取新的URL裝入隊列,直到滿(mǎn)足系統的一定停止條件。
為什么要學(xué)爬蟲(chóng)可以實(shí)現搜索引擎。我們學(xué)會(huì )了爬蟲(chóng)編撰以后,就可以借助爬蟲(chóng)手動(dòng)地采集互聯(lián)網(wǎng)中的信息,采集回來(lái)后進(jìn)行相應的儲存或處理,在須要檢索個(gè)別信息的時(shí)侯,只需在采集回來(lái)的信息中進(jìn)行檢索,即實(shí)現了私人的搜索引擎。大數據時(shí)代,可以使我們獲取更多的數據源。在進(jìn)行大數據剖析或則進(jìn)行數據挖掘的時(shí)侯,需要有數據源進(jìn)行剖析。我們可以從個(gè)別提供數據統計的網(wǎng)站獲得,也可以從個(gè)別文獻或內部資料中獲得,但是這種獲得數據的方法,有時(shí)很難滿(mǎn)足我們對數據的需求,而自動(dòng)從互聯(lián)網(wǎng)中去找尋那些數據,則花費的精力過(guò)大。此時(shí)就可以借助爬蟲(chóng)技術(shù),自動(dòng)地從互聯(lián)網(wǎng)中獲取我們感興趣的數據內容,并將這種數據內容爬取回去,作為我們的數據源,再進(jìn)行更深層次的數據剖析,并獲得更多有價(jià)值的信息??梢愿玫剡M(jìn)行搜索引擎優(yōu)化(SEO)。對于好多SEO從業(yè)者來(lái)說(shuō),為了更好的完成工作,那么就必須要對搜索引擎的工作原理十分清楚,同時(shí)也須要把握搜索引擎爬蟲(chóng)的工作原理。而學(xué)習爬蟲(chóng),可以更深層次地理解搜索引擎爬蟲(chóng)的工作原理,這樣在進(jìn)行搜索引擎優(yōu)化時(shí),才能知己知彼,百戰不殆。有利于就業(yè)。從就業(yè)來(lái)說(shuō),爬蟲(chóng)工程師方向是不錯的選擇之一,因為目前爬蟲(chóng)工程師的需求越來(lái)越大,而能否勝任這方面崗位的人員較少,所以屬于一個(gè)比較短缺的職業(yè)方向,并且隨著(zhù)大數據時(shí)代和人工智能的將至,爬蟲(chóng)技術(shù)的應用將越來(lái)越廣泛,在未來(lái)會(huì )擁有挺好的發(fā)展空間。
爬蟲(chóng)入門(mén)程序1.環(huán)境打算
編譯環(huán)境打算:
l JDK1.8l IntelliJ IDEAlIDEA自帶的Maven
IDEA操作步驟:
1.創(chuàng )建Maven工程itcast-crawler-first并給pom.xml加入依賴(lài)
org.apache.httpcomponents
httpclient
4.5.3
org.slf4j
slf4j-log4j12
1.7.25
2.加入log4j.properties
log4j.rootLogger=DEBUG,A1
log4j.logger.cn.itcast = DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
2.編寫(xiě)代碼 查看全部
自動(dòng)采集編寫(xiě) 聊一聊爬蟲(chóng)那點(diǎn)事兒(一)
爬蟲(chóng)學(xué)習入門(mén)篇

作為一名程序員,大家對于爬蟲(chóng)這個(gè)詞的理解都有不同,我曾經(jīng)的理解就是一只spider在網(wǎng)路上爬取東西,不過(guò)我們能控制這只spider去爬取須要內容并存取到數據庫中。后來(lái)才發(fā)覺(jué)爬蟲(chóng)有點(diǎn)重要?。?!
網(wǎng)絡(luò )爬蟲(chóng)的介紹
在大數據時(shí)代,信息的采集是一項重要的工作,而互聯(lián)網(wǎng)中的數據是海量的,如果單純靠人力進(jìn)行信息采集,不僅低效繁雜,搜集的成本也會(huì )增強。如何手動(dòng)高效地獲取互聯(lián)網(wǎng)中我們感興趣的信息并為我們所用是一個(gè)重要的問(wèn)題,而爬蟲(chóng)技術(shù)就是為了解決這種問(wèn)題而生的。
網(wǎng)絡(luò )爬蟲(chóng)(Web crawler)也稱(chēng)作網(wǎng)路機器人,可以取代人們手動(dòng)地在互聯(lián)網(wǎng)中進(jìn)行數據信息的采集與整理。它是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本,可以手動(dòng)采集所有其才能訪(fǎng)問(wèn)到的頁(yè)面內容,以獲取相關(guān)數據。
從功能上來(lái)講,爬蟲(chóng)通常分為數據采集,處理,儲存三個(gè)部份。爬蟲(chóng)從一個(gè)或若干初始網(wǎng)頁(yè)的URL開(kāi)始,獲得初始網(wǎng)頁(yè)上的URL,在抓取網(wǎng)頁(yè)的過(guò)程中,不斷從當前頁(yè)面上抽取新的URL裝入隊列,直到滿(mǎn)足系統的一定停止條件。
為什么要學(xué)爬蟲(chóng)可以實(shí)現搜索引擎。我們學(xué)會(huì )了爬蟲(chóng)編撰以后,就可以借助爬蟲(chóng)手動(dòng)地采集互聯(lián)網(wǎng)中的信息,采集回來(lái)后進(jìn)行相應的儲存或處理,在須要檢索個(gè)別信息的時(shí)侯,只需在采集回來(lái)的信息中進(jìn)行檢索,即實(shí)現了私人的搜索引擎。大數據時(shí)代,可以使我們獲取更多的數據源。在進(jìn)行大數據剖析或則進(jìn)行數據挖掘的時(shí)侯,需要有數據源進(jìn)行剖析。我們可以從個(gè)別提供數據統計的網(wǎng)站獲得,也可以從個(gè)別文獻或內部資料中獲得,但是這種獲得數據的方法,有時(shí)很難滿(mǎn)足我們對數據的需求,而自動(dòng)從互聯(lián)網(wǎng)中去找尋那些數據,則花費的精力過(guò)大。此時(shí)就可以借助爬蟲(chóng)技術(shù),自動(dòng)地從互聯(lián)網(wǎng)中獲取我們感興趣的數據內容,并將這種數據內容爬取回去,作為我們的數據源,再進(jìn)行更深層次的數據剖析,并獲得更多有價(jià)值的信息??梢愿玫剡M(jìn)行搜索引擎優(yōu)化(SEO)。對于好多SEO從業(yè)者來(lái)說(shuō),為了更好的完成工作,那么就必須要對搜索引擎的工作原理十分清楚,同時(shí)也須要把握搜索引擎爬蟲(chóng)的工作原理。而學(xué)習爬蟲(chóng),可以更深層次地理解搜索引擎爬蟲(chóng)的工作原理,這樣在進(jìn)行搜索引擎優(yōu)化時(shí),才能知己知彼,百戰不殆。有利于就業(yè)。從就業(yè)來(lái)說(shuō),爬蟲(chóng)工程師方向是不錯的選擇之一,因為目前爬蟲(chóng)工程師的需求越來(lái)越大,而能否勝任這方面崗位的人員較少,所以屬于一個(gè)比較短缺的職業(yè)方向,并且隨著(zhù)大數據時(shí)代和人工智能的將至,爬蟲(chóng)技術(shù)的應用將越來(lái)越廣泛,在未來(lái)會(huì )擁有挺好的發(fā)展空間。

爬蟲(chóng)入門(mén)程序1.環(huán)境打算
編譯環(huán)境打算:
l JDK1.8l IntelliJ IDEAlIDEA自帶的Maven
IDEA操作步驟:
1.創(chuàng )建Maven工程itcast-crawler-first并給pom.xml加入依賴(lài)

org.apache.httpcomponents
httpclient
4.5.3
org.slf4j
slf4j-log4j12
1.7.25
2.加入log4j.properties
log4j.rootLogger=DEBUG,A1
log4j.logger.cn.itcast = DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
2.編寫(xiě)代碼
自動(dòng)采集編寫(xiě) scrapy爬取新浪微博分享(2)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 393 次瀏覽 ? 2020-08-18 23:34
內容概要:
最近自己學(xué)習了一些爬蟲(chóng),學(xué)習之余,寫(xiě)了一個(gè)新浪微博的爬蟲(chóng)。大規模爬數據沒(méi)有試過(guò),但是爬取幾十萬(wàn)應當沒(méi)有哪些問(wèn)題。爬蟲(chóng)爬取的站點(diǎn)是新浪移動(dòng)端站點(diǎn)。github地址為:
第一次寫(xiě)文章,難免有疏漏,大家共同交流,共同進(jìn)步。也請喜歡的同學(xué),在github上打個(gè)star
內容分為三章,第一張介紹scrapy,第二張剖析爬取網(wǎng)站,第三章剖析代碼。
Fiddler工具
Fiddler是坐落客戶(hù)端和服務(wù)器端的HTTP代理,也是目前最常用的http抓包工具之一。它才能記錄客戶(hù)端和服務(wù)器之間的所有HTTP請求,可以針對特定的HTTP請求,分析懇求數據、設置斷點(diǎn)、調試Web應用、請求更改數據、甚至可以更改服務(wù)器返回的數據,功能十分強悍,是WEB調試的神器。
既然是代理,也就是說(shuō):客戶(hù)端的所有懇求都要先經(jīng)過(guò)Fiddler,然后轉發(fā)到相應的服務(wù)器,反之,服務(wù)器端的所有相應,也就會(huì )先經(jīng)過(guò)Fiddler之后發(fā)送到客戶(hù)端。
分析新浪微博數據結構
首先我們登陸微博可以看見(jiàn)Fiddler抓取的包:
其中點(diǎn)擊 /api/container/getIndex?type=uid&value=6311254871&containerid=54871 HTTP/1.1我們可以看見(jiàn)微博獲取個(gè)人信息的API接口,里面儲存著(zhù)json數據。
簡(jiǎn)單剖析下JSON,我們可以曉得上面儲存著(zhù)愛(ài)稱(chēng)、個(gè)性簽名、微博數、關(guān)注數、粉絲數等個(gè)人信息。我們可以記錄下我們須要的信息。
同理,我們通過(guò)不斷剖析Fiddler抓取的包可以得到微博內容的API,粉絲列表的API,關(guān)注者列表的API。里面依然是JSON格式,我們從中記錄下我們須要的信息。
編寫(xiě)Model層
剛剛我們記錄下了各個(gè)API中我們須要抓取的信息,然后就可以在程序中編撰我們的數據層了。scrapy是用Django編撰的,他們的數據層基本是一樣的,是由Django的ARM框架封裝的。
類(lèi)似于右圖,我們把帶抓取的數據格式寫(xiě)好:
把數據庫配置好:
完成以上步驟就可以打算編撰我們的爬蟲(chóng)代碼了。
參考:
1、《Python網(wǎng)路數據采集》
2、 查看全部
自動(dòng)采集編寫(xiě) scrapy爬取新浪微博分享(2)
內容概要:
最近自己學(xué)習了一些爬蟲(chóng),學(xué)習之余,寫(xiě)了一個(gè)新浪微博的爬蟲(chóng)。大規模爬數據沒(méi)有試過(guò),但是爬取幾十萬(wàn)應當沒(méi)有哪些問(wèn)題。爬蟲(chóng)爬取的站點(diǎn)是新浪移動(dòng)端站點(diǎn)。github地址為:
第一次寫(xiě)文章,難免有疏漏,大家共同交流,共同進(jìn)步。也請喜歡的同學(xué),在github上打個(gè)star
內容分為三章,第一張介紹scrapy,第二張剖析爬取網(wǎng)站,第三章剖析代碼。
Fiddler工具
Fiddler是坐落客戶(hù)端和服務(wù)器端的HTTP代理,也是目前最常用的http抓包工具之一。它才能記錄客戶(hù)端和服務(wù)器之間的所有HTTP請求,可以針對特定的HTTP請求,分析懇求數據、設置斷點(diǎn)、調試Web應用、請求更改數據、甚至可以更改服務(wù)器返回的數據,功能十分強悍,是WEB調試的神器。
既然是代理,也就是說(shuō):客戶(hù)端的所有懇求都要先經(jīng)過(guò)Fiddler,然后轉發(fā)到相應的服務(wù)器,反之,服務(wù)器端的所有相應,也就會(huì )先經(jīng)過(guò)Fiddler之后發(fā)送到客戶(hù)端。
分析新浪微博數據結構
首先我們登陸微博可以看見(jiàn)Fiddler抓取的包:

其中點(diǎn)擊 /api/container/getIndex?type=uid&value=6311254871&containerid=54871 HTTP/1.1我們可以看見(jiàn)微博獲取個(gè)人信息的API接口,里面儲存著(zhù)json數據。
簡(jiǎn)單剖析下JSON,我們可以曉得上面儲存著(zhù)愛(ài)稱(chēng)、個(gè)性簽名、微博數、關(guān)注數、粉絲數等個(gè)人信息。我們可以記錄下我們須要的信息。
同理,我們通過(guò)不斷剖析Fiddler抓取的包可以得到微博內容的API,粉絲列表的API,關(guān)注者列表的API。里面依然是JSON格式,我們從中記錄下我們須要的信息。
編寫(xiě)Model層
剛剛我們記錄下了各個(gè)API中我們須要抓取的信息,然后就可以在程序中編撰我們的數據層了。scrapy是用Django編撰的,他們的數據層基本是一樣的,是由Django的ARM框架封裝的。
類(lèi)似于右圖,我們把帶抓取的數據格式寫(xiě)好:

把數據庫配置好:

完成以上步驟就可以打算編撰我們的爬蟲(chóng)代碼了。
參考:
1、《Python網(wǎng)路數據采集》
2、
全手動(dòng)采集版小說(shuō)網(wǎng)站不用管理
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 392 次瀏覽 ? 2020-08-18 16:03
商品屬性
安裝環(huán)境
商品介紹
您能找到這個(gè)小說(shuō)源碼,說(shuō)明您準備用心建一個(gè)小說(shuō)網(wǎng)站,做站最重要的就是穩定更新和程序的不斷升級,你會(huì )選擇仍然不升級的源碼嗎?該小說(shuō)源碼程序,定期更新,請放心使用建站。為什么選擇dedecms做的這個(gè)程序做小說(shuō)網(wǎng),那是因為現今杰奇小說(shuō)程序和模板猖獗,您假如想從幾百萬(wàn)個(gè)一樣的網(wǎng)站中脫引而出這么就選擇這套dedecms開(kāi)發(fā)的源碼來(lái)建設您的網(wǎng)站嗎?大家都曉得國外SEO好友的程序源碼就是這個(gè)dedecms。還在遲疑哪些呢,趕快下手吧,建站和更新內容一樣,越早越好。
全網(wǎng)僅此一家為正版域名授權,如果有其他店面銷(xiāo)售,那肯定是二手或則山寨的了!
近期發(fā)覺(jué)有同行盜賣(mài)本店的程序,并且十分不厚道的說(shuō)是他自己開(kāi)發(fā)的,真是無(wú)語(yǔ)。
全新升級20151107版,支持:
百度主動(dòng)推送
百度站內搜索
后臺采集規則在線(xiàn)更新(目前預留)
多種章節內容儲存方法
微信小說(shuō)公眾號驗證平臺(支持微信公眾號自定義頂部菜單)
支持緩存功能等等,程序更快,負載更大!
重大更新,本程序被百度收錄后,主頁(yè)會(huì )手動(dòng)顯示logo,小說(shuō)目錄會(huì )手動(dòng)小說(shuō)模版適配:
還有好多功能是這些盜賣(mài)的難以提供的。
另外,本程序實(shí)行后臺在線(xiàn)更新后,其他盜賣(mài)的就難以繼續升級了,之前的更新都是直接提供更新包,而這些盜賣(mài)的就直接從群里拿了更新包說(shuō)是自己提供的更新包。 我們故意拖延了半年沒(méi)更新,結果就可想而知了......
我們的后臺還提供了更新歷史,可以查看每次更新了什么功能,并提供了新功能的使用說(shuō)明......
1、源碼類(lèi)型:整站源碼
2-1、環(huán)境要求:PHP5.2/5.3/5.4/5.5+MYSQL5(URLrewrite)
2-2、服務(wù)器要求:建議用40G數據盤(pán)以上的VPS或則獨立服務(wù)器,系統建議用Windows而不建議用Linux,99%的小說(shuō)站服務(wù)器是用Windows系統,方便文件管理以及備份等(目前演示站空間使用情況:6.5G數據庫+5G網(wǎng)頁(yè)空間,經(jīng)群內站友網(wǎng)站證實(shí):4核CPU+4G顯存的xen構架VPS能承受日5萬(wàn)IP、50萬(wàn)PV流量毫無(wú)壓力,每天收入700元以上)
3、原創(chuàng )程序:織夢(mèng)DEDECMS 5.7SP1
4、編碼類(lèi)型:GBK
5、可否采集:全手動(dòng)采集,贈送規則,好評后還可以免費訂制一條
6、演示站點(diǎn): ,自帶手機版:(可提供免費友情鏈接)
7、安裝升級:包安裝、附帶詳盡使用說(shuō)明,免費升級
8、其他特征:
?。?)自動(dòng)生成首頁(yè)、分類(lèi)、目錄、作者、排行榜、sitemap頁(yè)面靜態(tài)html。
?。?)全站拼音目錄化(可自定義URL格式),章節頁(yè)面偽靜態(tài)。
?。?)支持下載功能,可以手動(dòng)生成對應文本文件,可在文件中設置廣告。
?。?)自動(dòng)生成關(guān)鍵詞及關(guān)鍵詞手動(dòng)內鏈。
?。?)自動(dòng)偽原創(chuàng )成語(yǔ)替換(采集、輸出時(shí)都可以替換)。
?。?)配合CNZZ的統計插件,能便捷實(shí)現下載明細統計和被采集的明細統計等。
?。?)本程序的手動(dòng)采集并非市面上常見(jiàn)的、關(guān)關(guān)、采集俠等,而是在DEDE原有采集功能的基礎上二次開(kāi)發(fā)的采集模塊,可以有效的保證章節內容的完整性,避免章節重復、章節內容無(wú)內容、章節亂碼等;一天24小時(shí)采集量能達到25~30萬(wàn)章節。
20140623更新后全面提高了本源碼程序的采集功能,使采集速度更快、更穩定,后臺可以單獨優(yōu)先采集某本小說(shuō),可以對無(wú)關(guān)緊要的章節手動(dòng)進(jìn)行過(guò)濾……
20140806更新后新增了【無(wú)縫換站采集功能】,當原先的采集目標站不能采集時(shí),可切換到其他目標站進(jìn)行采集,采集永不間斷,章節永遠;新增【自定義小說(shuō)封面頁(yè)URL】、【自定義作者頁(yè)URL】;任何對章節的操作(新增、修改、刪除、移動(dòng)、合并等)執行后均手動(dòng)更新小說(shuō)封面的功能……
20141110本支持自動(dòng)換站采集、自動(dòng)換站,半自動(dòng)添加單本采集,無(wú)采集規則或規則失效時(shí)手動(dòng)提醒功能……
采集模式降低為3種,增加目標站章節正序采集功能,能采集市面上99%的小說(shuō)站
20141205更新陌陌小說(shuō)模塊,可以在陌陌上看小說(shuō)……
20150306更新后臺全新的小說(shuō)管理面板,功能更強大,操作更簡(jiǎn)單。增加單本自定義換站采集功能,增加小說(shuō)百度指數查詢(xún),方便刪掉沒(méi)有指數的小說(shuō)。增加批量刪掉小說(shuō)、批量更新小說(shuō)簡(jiǎn)介頁(yè)面的功能。優(yōu)化全手動(dòng)采集功能,不需要任何采集工具,不需要打開(kāi)任何采集頁(yè)面,只要網(wǎng)站有流量,就能時(shí)間更新書(shū)友最喜歡看的小說(shuō),與源站更新時(shí)間差保持在5秒以?xún)取?br /> 20151020全新升級20多項功能,支持后臺直接更新程序....
本程序本為20160414版,低于些版本都為盜賣(mài)。
給諸位新站長(cháng)的友情提示:
不要相信這些所謂“有訪(fǎng)客下載時(shí)才手動(dòng)生成txt電子書(shū)”的外行說(shuō)法,因為提出這些概念的人可以肯定他不是站長(cháng)出生,沒(méi)有服務(wù)器資源需求的概念!這里說(shuō)明一下,txt電子書(shū)在生成的時(shí)侯是比較占用服務(wù)器資源的,同時(shí)生成1本小說(shuō)的txt電子書(shū)大約會(huì )占用5%~8%左右的CPU以及部份硬碟I/O,但是假如須要同時(shí)生成20本小說(shuō)的電子書(shū)的話(huà),你的服務(wù)器都會(huì )吃不消,如果同時(shí)須要生成更多的電子書(shū),那你的服務(wù)器就立刻奔潰了,整個(gè)網(wǎng)站都難以訪(fǎng)問(wèn)!如果使用須要下載的時(shí)侯再生成電子書(shū)的辦法,你就要考慮一下當你的網(wǎng)站同時(shí)有幾十個(gè)人在下載的時(shí)侯會(huì )是什么樣的情況了。 查看全部
全手動(dòng)采集版小說(shuō)網(wǎng)站不用管理
商品屬性
安裝環(huán)境
商品介紹
您能找到這個(gè)小說(shuō)源碼,說(shuō)明您準備用心建一個(gè)小說(shuō)網(wǎng)站,做站最重要的就是穩定更新和程序的不斷升級,你會(huì )選擇仍然不升級的源碼嗎?該小說(shuō)源碼程序,定期更新,請放心使用建站。為什么選擇dedecms做的這個(gè)程序做小說(shuō)網(wǎng),那是因為現今杰奇小說(shuō)程序和模板猖獗,您假如想從幾百萬(wàn)個(gè)一樣的網(wǎng)站中脫引而出這么就選擇這套dedecms開(kāi)發(fā)的源碼來(lái)建設您的網(wǎng)站嗎?大家都曉得國外SEO好友的程序源碼就是這個(gè)dedecms。還在遲疑哪些呢,趕快下手吧,建站和更新內容一樣,越早越好。
全網(wǎng)僅此一家為正版域名授權,如果有其他店面銷(xiāo)售,那肯定是二手或則山寨的了!
近期發(fā)覺(jué)有同行盜賣(mài)本店的程序,并且十分不厚道的說(shuō)是他自己開(kāi)發(fā)的,真是無(wú)語(yǔ)。
全新升級20151107版,支持:
百度主動(dòng)推送
百度站內搜索
后臺采集規則在線(xiàn)更新(目前預留)
多種章節內容儲存方法
微信小說(shuō)公眾號驗證平臺(支持微信公眾號自定義頂部菜單)
支持緩存功能等等,程序更快,負載更大!
重大更新,本程序被百度收錄后,主頁(yè)會(huì )手動(dòng)顯示logo,小說(shuō)目錄會(huì )手動(dòng)小說(shuō)模版適配:
還有好多功能是這些盜賣(mài)的難以提供的。
另外,本程序實(shí)行后臺在線(xiàn)更新后,其他盜賣(mài)的就難以繼續升級了,之前的更新都是直接提供更新包,而這些盜賣(mài)的就直接從群里拿了更新包說(shuō)是自己提供的更新包。 我們故意拖延了半年沒(méi)更新,結果就可想而知了......
我們的后臺還提供了更新歷史,可以查看每次更新了什么功能,并提供了新功能的使用說(shuō)明......
1、源碼類(lèi)型:整站源碼
2-1、環(huán)境要求:PHP5.2/5.3/5.4/5.5+MYSQL5(URLrewrite)
2-2、服務(wù)器要求:建議用40G數據盤(pán)以上的VPS或則獨立服務(wù)器,系統建議用Windows而不建議用Linux,99%的小說(shuō)站服務(wù)器是用Windows系統,方便文件管理以及備份等(目前演示站空間使用情況:6.5G數據庫+5G網(wǎng)頁(yè)空間,經(jīng)群內站友網(wǎng)站證實(shí):4核CPU+4G顯存的xen構架VPS能承受日5萬(wàn)IP、50萬(wàn)PV流量毫無(wú)壓力,每天收入700元以上)
3、原創(chuàng )程序:織夢(mèng)DEDECMS 5.7SP1
4、編碼類(lèi)型:GBK
5、可否采集:全手動(dòng)采集,贈送規則,好評后還可以免費訂制一條
6、演示站點(diǎn): ,自帶手機版:(可提供免費友情鏈接)
7、安裝升級:包安裝、附帶詳盡使用說(shuō)明,免費升級
8、其他特征:
?。?)自動(dòng)生成首頁(yè)、分類(lèi)、目錄、作者、排行榜、sitemap頁(yè)面靜態(tài)html。
?。?)全站拼音目錄化(可自定義URL格式),章節頁(yè)面偽靜態(tài)。
?。?)支持下載功能,可以手動(dòng)生成對應文本文件,可在文件中設置廣告。
?。?)自動(dòng)生成關(guān)鍵詞及關(guān)鍵詞手動(dòng)內鏈。
?。?)自動(dòng)偽原創(chuàng )成語(yǔ)替換(采集、輸出時(shí)都可以替換)。
?。?)配合CNZZ的統計插件,能便捷實(shí)現下載明細統計和被采集的明細統計等。
?。?)本程序的手動(dòng)采集并非市面上常見(jiàn)的、關(guān)關(guān)、采集俠等,而是在DEDE原有采集功能的基礎上二次開(kāi)發(fā)的采集模塊,可以有效的保證章節內容的完整性,避免章節重復、章節內容無(wú)內容、章節亂碼等;一天24小時(shí)采集量能達到25~30萬(wàn)章節。
20140623更新后全面提高了本源碼程序的采集功能,使采集速度更快、更穩定,后臺可以單獨優(yōu)先采集某本小說(shuō),可以對無(wú)關(guān)緊要的章節手動(dòng)進(jìn)行過(guò)濾……
20140806更新后新增了【無(wú)縫換站采集功能】,當原先的采集目標站不能采集時(shí),可切換到其他目標站進(jìn)行采集,采集永不間斷,章節永遠;新增【自定義小說(shuō)封面頁(yè)URL】、【自定義作者頁(yè)URL】;任何對章節的操作(新增、修改、刪除、移動(dòng)、合并等)執行后均手動(dòng)更新小說(shuō)封面的功能……
20141110本支持自動(dòng)換站采集、自動(dòng)換站,半自動(dòng)添加單本采集,無(wú)采集規則或規則失效時(shí)手動(dòng)提醒功能……
采集模式降低為3種,增加目標站章節正序采集功能,能采集市面上99%的小說(shuō)站
20141205更新陌陌小說(shuō)模塊,可以在陌陌上看小說(shuō)……
20150306更新后臺全新的小說(shuō)管理面板,功能更強大,操作更簡(jiǎn)單。增加單本自定義換站采集功能,增加小說(shuō)百度指數查詢(xún),方便刪掉沒(méi)有指數的小說(shuō)。增加批量刪掉小說(shuō)、批量更新小說(shuō)簡(jiǎn)介頁(yè)面的功能。優(yōu)化全手動(dòng)采集功能,不需要任何采集工具,不需要打開(kāi)任何采集頁(yè)面,只要網(wǎng)站有流量,就能時(shí)間更新書(shū)友最喜歡看的小說(shuō),與源站更新時(shí)間差保持在5秒以?xún)取?br /> 20151020全新升級20多項功能,支持后臺直接更新程序....
本程序本為20160414版,低于些版本都為盜賣(mài)。
給諸位新站長(cháng)的友情提示:
不要相信這些所謂“有訪(fǎng)客下載時(shí)才手動(dòng)生成txt電子書(shū)”的外行說(shuō)法,因為提出這些概念的人可以肯定他不是站長(cháng)出生,沒(méi)有服務(wù)器資源需求的概念!這里說(shuō)明一下,txt電子書(shū)在生成的時(shí)侯是比較占用服務(wù)器資源的,同時(shí)生成1本小說(shuō)的txt電子書(shū)大約會(huì )占用5%~8%左右的CPU以及部份硬碟I/O,但是假如須要同時(shí)生成20本小說(shuō)的電子書(shū)的話(huà),你的服務(wù)器都會(huì )吃不消,如果同時(shí)須要生成更多的電子書(shū),那你的服務(wù)器就立刻奔潰了,整個(gè)網(wǎng)站都難以訪(fǎng)問(wèn)!如果使用須要下載的時(shí)侯再生成電子書(shū)的辦法,你就要考慮一下當你的網(wǎng)站同時(shí)有幾十個(gè)人在下載的時(shí)侯會(huì )是什么樣的情況了。
web網(wǎng)路漏洞掃描器編撰
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 261 次瀏覽 ? 2020-08-18 00:36
這三天看了好多web漏洞掃描器編撰的文章,比如W12scan以及其前身W8scan,還有豬豬俠的自動(dòng)化功擊背景下的過(guò)去、現在與未來(lái),以及網(wǎng)上好多優(yōu)秀的掃描器和博客,除了之前寫(xiě)了一部分的靜湖ABC段掃描器,接下來(lái)有空的大部分時(shí)間就會(huì )用于編撰這個(gè)掃描器,相當于是對自己的一個(gè)階段性挑戰吧,也算是為了建立自己的技術(shù)棧。
因為想把掃描器弄成web應用,像W12scan,bugscan,AWVS那樣的,部署好了以后登錄,添加須要掃描的url,自動(dòng)化進(jìn)行漏洞掃描,首先須要將掃描器的web界面完成,也就是前前端弄好,漏洞掃描作為前面添加進(jìn)去的功能,在原基礎上進(jìn)行更改。
因為時(shí)間不是太充裕,所以選擇Flask框架進(jìn)行web的開(kāi)發(fā),學(xué)習的視頻是:
找了許久的視頻,要么就是太緊了,對于好多地方?jīng)]有講透徹,要么就是幾百集的教程丟過(guò)來(lái),過(guò)于冗長(cháng)。
文檔可以看官方文檔,或者是這個(gè):
當然遇見(jiàn)不會(huì )的問(wèn)題還須要微軟搜索一下,發(fā)揮自己的主觀(guān)能動(dòng)性。
接下來(lái)漸漸更新這一篇博客,先學(xué)Flask,哪里不會(huì )點(diǎn)技能樹(shù)的那里吧。當然也不能舍棄代碼審計,CTF和網(wǎng)課的學(xué)習
2020/4/2更新
框架快搭建好了,先做了登陸界面
然后掃描器的基礎功能也在readme上面寫(xiě)好了,側重的功能模塊是信息采集和FUZZ模塊
碎遮 Web漏洞掃描器
環(huán)境要求:
python版本要求:3.x,python運行需要的類(lèi)庫在requirements.txt中,執行
pip3 install -r requirements.txt
進(jìn)行類(lèi)庫的下載
主要功能:
一,輸入源采集:
1,基于流量清洗
2,基于日志提取
3,基于爬蟲(chóng)提取
二,輸入源信息搜集(+)
1,被動(dòng)信息搜集:(公開(kāi)渠道可獲得信息,與目標系統不產(chǎn)生直接交互)
1,whois 信息 獲取關(guān)鍵注冊人的信息 chinaz
2,在線(xiàn)子域名挖掘(這里不會(huì )ban掉自身IP,放進(jìn)被動(dòng)信息搜集中)
3,繞過(guò)CDN查找真實(shí)IP
4,DNS信息搜集
5,旁站查詢(xún)
6,云悉指紋
7,備案信息
8,搜索引擎搜索
9,備案查詢(xún)
2,主動(dòng)信息搜集:
1,旁站C段服務(wù)簡(jiǎn)單掃描
2,子域名爆破
3,CMS指紋識別
4,敏感目錄,文件掃描
5,端口及運行服務(wù)
6,服務(wù)器及中間件信息
7,WAF檢測
8,敏感信息泄露 .svn,.git 等等
9,登錄界面發(fā)現
三,SQL注入漏洞
四,XSS漏洞檢測
五,命令執行類(lèi)漏洞
六,文件包含類(lèi)漏洞
七,登錄弱密碼爆破
八,FUZZ模塊
可視化界面:
使用flask+javascript+html+css編寫(xiě)
啟動(dòng)index.py,在瀏覽器中訪(fǎng)問(wèn)127.0.0.1:5000訪(fǎng)問(wèn)
準備開(kāi)始模塊的編撰,加油趴
整個(gè)項目如今完成了1/3的樣子,因為自己缺少構架的經(jīng)驗,所以暫時(shí)只能走一步看一步,最開(kāi)始使用MySQL數據庫打算換成redis非關(guān)系型數據庫推動(dòng)讀寫(xiě)速率,掃描器在寫(xiě)的過(guò)程中豐富了自己對于各方面知識的把握
貼上W12scan的代碼構架鄉樓
從構架圖上面跟自己掃描器的看法進(jìn)行了一些驗證和補充。自己寫(xiě)的時(shí)侯應當不會(huì )用到elastic,可以考慮使用redis和MySQL數據庫兩個(gè)互相進(jìn)行配合儲存數據。
另外在掃描范圍上要進(jìn)行合法范圍的擴大化。 查看全部
web網(wǎng)路漏洞掃描器編撰
這三天看了好多web漏洞掃描器編撰的文章,比如W12scan以及其前身W8scan,還有豬豬俠的自動(dòng)化功擊背景下的過(guò)去、現在與未來(lái),以及網(wǎng)上好多優(yōu)秀的掃描器和博客,除了之前寫(xiě)了一部分的靜湖ABC段掃描器,接下來(lái)有空的大部分時(shí)間就會(huì )用于編撰這個(gè)掃描器,相當于是對自己的一個(gè)階段性挑戰吧,也算是為了建立自己的技術(shù)棧。
因為想把掃描器弄成web應用,像W12scan,bugscan,AWVS那樣的,部署好了以后登錄,添加須要掃描的url,自動(dòng)化進(jìn)行漏洞掃描,首先須要將掃描器的web界面完成,也就是前前端弄好,漏洞掃描作為前面添加進(jìn)去的功能,在原基礎上進(jìn)行更改。
因為時(shí)間不是太充裕,所以選擇Flask框架進(jìn)行web的開(kāi)發(fā),學(xué)習的視頻是:
找了許久的視頻,要么就是太緊了,對于好多地方?jīng)]有講透徹,要么就是幾百集的教程丟過(guò)來(lái),過(guò)于冗長(cháng)。
文檔可以看官方文檔,或者是這個(gè):
當然遇見(jiàn)不會(huì )的問(wèn)題還須要微軟搜索一下,發(fā)揮自己的主觀(guān)能動(dòng)性。
接下來(lái)漸漸更新這一篇博客,先學(xué)Flask,哪里不會(huì )點(diǎn)技能樹(shù)的那里吧。當然也不能舍棄代碼審計,CTF和網(wǎng)課的學(xué)習
2020/4/2更新
框架快搭建好了,先做了登陸界面

然后掃描器的基礎功能也在readme上面寫(xiě)好了,側重的功能模塊是信息采集和FUZZ模塊
碎遮 Web漏洞掃描器
環(huán)境要求:
python版本要求:3.x,python運行需要的類(lèi)庫在requirements.txt中,執行
pip3 install -r requirements.txt
進(jìn)行類(lèi)庫的下載
主要功能:
一,輸入源采集:
1,基于流量清洗
2,基于日志提取
3,基于爬蟲(chóng)提取
二,輸入源信息搜集(+)
1,被動(dòng)信息搜集:(公開(kāi)渠道可獲得信息,與目標系統不產(chǎn)生直接交互)
1,whois 信息 獲取關(guān)鍵注冊人的信息 chinaz
2,在線(xiàn)子域名挖掘(這里不會(huì )ban掉自身IP,放進(jìn)被動(dòng)信息搜集中)
3,繞過(guò)CDN查找真實(shí)IP
4,DNS信息搜集
5,旁站查詢(xún)
6,云悉指紋
7,備案信息
8,搜索引擎搜索
9,備案查詢(xún)
2,主動(dòng)信息搜集:
1,旁站C段服務(wù)簡(jiǎn)單掃描
2,子域名爆破
3,CMS指紋識別
4,敏感目錄,文件掃描
5,端口及運行服務(wù)
6,服務(wù)器及中間件信息
7,WAF檢測
8,敏感信息泄露 .svn,.git 等等
9,登錄界面發(fā)現
三,SQL注入漏洞
四,XSS漏洞檢測
五,命令執行類(lèi)漏洞
六,文件包含類(lèi)漏洞
七,登錄弱密碼爆破
八,FUZZ模塊
可視化界面:
使用flask+javascript+html+css編寫(xiě)
啟動(dòng)index.py,在瀏覽器中訪(fǎng)問(wèn)127.0.0.1:5000訪(fǎng)問(wèn)
準備開(kāi)始模塊的編撰,加油趴
整個(gè)項目如今完成了1/3的樣子,因為自己缺少構架的經(jīng)驗,所以暫時(shí)只能走一步看一步,最開(kāi)始使用MySQL數據庫打算換成redis非關(guān)系型數據庫推動(dòng)讀寫(xiě)速率,掃描器在寫(xiě)的過(guò)程中豐富了自己對于各方面知識的把握
貼上W12scan的代碼構架鄉樓

從構架圖上面跟自己掃描器的看法進(jìn)行了一些驗證和補充。自己寫(xiě)的時(shí)侯應當不會(huì )用到elastic,可以考慮使用redis和MySQL數據庫兩個(gè)互相進(jìn)行配合儲存數據。
另外在掃描范圍上要進(jìn)行合法范圍的擴大化。
第04期:Prometheus 數據采集(三)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 441 次瀏覽 ? 2020-08-17 22:27
本期作者:羅韋
愛(ài)可生上海研發(fā)中心成員,研發(fā)工程師,主要負責 DMP 平臺監控告警功能的相關(guān)工作。
Prometheus 的監控對象各式各樣,沒(méi)有統一標準。為了解決這個(gè)問(wèn)題,Prometheus 制定了一套監控規范,符合這個(gè)規范的樣本數據可以被 Prometheus 采集并解析樣本數據。Exporter 在 Prometheus 監控系統中是一個(gè)采集監控數據并通過(guò) Prometheus 監控規范對外提供數據的組件,針對不同的監控對象可以實(shí)現不同的 Exporter,這樣就解決了監控對象標準不一的問(wèn)題。從廣義上說(shuō),所有可以向 Prometheus 提供監控樣本數據的程序都可以稱(chēng)為 Exporter,Exporter 的實(shí)例也就是我們上期所說(shuō)的"target"。
Exporter 的運行方法Exporter 有兩種運行方法Exporter 接口數據規范
Exporter 通過(guò) HTTP 接口以文本方式向 Prometheus 暴露樣本數據,格式簡(jiǎn)單,沒(méi)有嵌套,可讀性強。每個(gè)監控指標對應的數據文本格式如下:
# HELP
# TYPE
{ =,=...}
{ =,=...}
...
# HELP x balabala
# TYPE x summary
x{quantile="0.5"} value1
x{quantile="0.9"} value2
x{quantile="0.99"} value3
x_sum sum(values)
x_count count(values)
# HELP x The temperature of cpu
# TYPE x histogram
x_bucket{le="20"} value1
x_bucket{le="50"} value2
x_bucket{le="70"} value3
x_bucket{le="+Inf"} count(values)
x_sum sum(values)
x_count count(values)
這樣的文本格式也有不足之處:
1. 文本內容可能過(guò)分繁瑣;
2. Prometheus 在解析時(shí)不能校準 HELP 和 TYPE 字段是否缺位,如果缺位 HELP 字段,這條樣本數據的來(lái)源可能就無(wú)法判定;如果缺位 TYPE 字段,Prometheus 對這條樣本數據的類(lèi)型就無(wú)從得悉;
3. 相比于 protobuf,Prometheus 使用的文本格式?jīng)]有做任何壓縮處理,解析成本較高。
MySQL Server Exporter
針對被廣泛使用的關(guān)系型數據庫 MySQL,Prometheus 官方提供了 MySQL Server Exporter,支持 MySQL 5.6 及以上版本,對于 5.6 以下的版本,部分監控指標可能不支持。
MySQL Server Exporter 監控的信息包括了常用的 global status/variables 信息、schema/table 的統計信息、user 統計信息、innodb 的信息以及主從復制、組復制的信息,監控指標比較全面。但是因為它提供的監控指標中缺乏對 MySQL 實(shí)例的標示,所以當一臺主機上存在多個(gè) MySQL 實(shí)例,需要運行多個(gè) MySQL Server Exporter 進(jìn)行監控時(shí),就會(huì )無(wú)法分辨實(shí)例信息。具體使用方法可參考:
Node Exporter
Prometheus 官方的 Node Exporter 提供對 *NIX 系統、硬件信息的監控,監控指標包括 CPU 使用率/配置、系統平均負載、內存信息、網(wǎng)絡(luò )狀況、文件系統信息統計、磁盤(pán)使用情況統計等。對于不同的系統,監控指標會(huì )有所差別,如 diskstats 支持 Darwin, Linux, OpenBSD 系統;loadavg 支持 Darwin, Dragonfly, FreeBSD, Linux, NetBSD, OpenBSD, Solaris 系統。Node Exporter 的監控指標沒(méi)有對主機身分的標示,可以通過(guò) relabel 功能在 Prometheus Server 端降低一些標示標簽。具體使用方法可參考:
如何實(shí)現一個(gè) Exporter編撰一個(gè)簡(jiǎn)單的 Exporter
使用 prometheus/client_golang 包,我們來(lái)編撰一個(gè)簡(jiǎn)單的 Exporter,包括 Prometheus 支持的四種監控指標類(lèi)型
package main
import (
"log"
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
//使用GaugeVec類(lèi)型可以為監控指標設置標簽,這里為監控指標增加一個(gè)標簽"device"
speed = prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "disk_available_bytes",
Help: "Disk space available in bytes",
}, []string{"device"})
tasksTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: "test_tasks_total",
Help: "Total number of test tasks",
})
taskDuration = prometheus.NewSummary(prometheus.SummaryOpts{
Name: "task_duration_seconds",
Help: "Duration of task in seconds",
//Summary類(lèi)型的監控指標需要提供分位點(diǎn)
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
})
cpuTemperature = prometheus.NewHistogram(prometheus.HistogramOpts{
Name: "cpu_temperature",
Help: "The temperature of cpu",
//Histogram類(lèi)型的監控指標需要提供Bucket
Buckets: []float64{20, 50, 70, 80},
})
)
func init() {
//注冊監控指標
prometheus.MustRegister(speed)
prometheus.MustRegister(tasksTotal)
prometheus.MustRegister(taskDuration)
prometheus.MustRegister(cpuTemperature)
}
func main() {
//模擬采集監控數據
fakeData()
//使用prometheus提供的promhttp.Handler()暴露監控樣本數據
//prometheus默認從"/metrics"接口拉取監控樣本數據
http.Handle("/metrics", promhttp.Handler())
log.Fatal(http.ListenAndServe(":10000", nil))
}
func fakeData() {
tasksTotal.Inc()
//設置該條樣本數據的"device"標簽值為"/dev/sda"
speed.With(prometheus.Labels{"device": "/dev/sda"}).Set(82115880)
taskDuration.Observe(10)
taskDuration.Observe(20)
taskDuration.Observe(30)
taskDuration.Observe(45)
taskDuration.Observe(56)
taskDuration.Observe(80)
cpuTemperature.Observe(30)
cpuTemperature.Observe(43)
cpuTemperature.Observe(56)
cpuTemperature.Observe(58)
cpuTemperature.Observe(65)
cpuTemperature.Observe(70)
}
接下來(lái)編譯、運行我們的 Exporter
GOOS=linux GOARCH=amd64 go build -o my_exporter main.go
./my_exporter &
Exporter 運行上去以后,還要在 Prometheus 的配置文件中加入 Exporter 信息,Prometheus 才能從 Exporter 拉取數據。
static_configs:
- targets: ['localhost:9090','172.17.0.3:10000']
在 Prometheus 的 targets 頁(yè)面可以看見(jiàn)剛剛新增的 Exporter 了
untitled.png
訪(fǎng)問(wèn)"/metrics"接口可以找到如下數據:
Gauge
因為我們使用了 GaugeVec,所以形成了帶標簽的樣本數據
# HELP disk_available_bytes disk space available in bytes
# TYPE disk_available_bytes gauge
disk_available_bytes{device="/dev/sda"} 8.211588e+07
Counter
# HELP test_tasks_total total number of test tasks
# TYPE test_tasks_total counter
test_tasks_total 1
Summary
# HELP task_duration_seconds Duration of task in seconds
# TYPE task_duration_seconds summary
task_duration_seconds{quantile="0.5"} 30
task_duration_seconds{quantile="0.9"} 80
task_duration_seconds{quantile="0.99"} 80
task_duration_seconds_sum 241
task_duration_seconds_count 6
Histogram
# HELP cpu_temperature The temperature of cpu
# TYPE cpu_temperature histogram
cpu_temperature_bucket{le="20"} 0
cpu_temperature_bucket{le="50"} 2
cpu_temperature_bucket{le="70"} 6
cpu_temperature_bucket{le="80"} 6
cpu_temperature_bucket{le="+Inf"} 6
cpu_temperature_sum 322
cpu_temperature_count 6
Exporter實(shí)現方法的審視
上面的板栗中,我們在程序一開(kāi)始就初始化所有的監控指標,這種方案一般接下來(lái)會(huì )開(kāi)啟一個(gè)取樣解釋器去定期采集、更新監控指標的樣本數據,最新的樣本數據將仍然保留在顯存中,在接到 Prometheus Server 的懇求時(shí),返回顯存里的樣本數據。這個(gè)方案的優(yōu)點(diǎn)在于,易于控制取樣頻度;不用害怕并發(fā)取樣可能帶來(lái)的資源占據問(wèn)題。不足之處有:
1. 由于樣本數據不會(huì )被手動(dòng)清除,當某個(gè)已被取樣的采集對象失效了,Prometheus Server 依然能拉取到它的樣本數據,只是這個(gè)數據從監控對象失效時(shí)就早已不會(huì )再被更新。這就須要 Exporter 自己提供一個(gè)對無(wú)效監控對象的數據清除機制;
2. 由于響應 Prometheus Server 的懇求是從顯存里取數據,如果 Exporter 的取樣解釋器異??ㄗ?,Prometheus Server 也難以感知,拉取到的數據可能是過(guò)期數據;
3. Prometheus Server 拉取的數據不是即時(shí)取樣的,對于某時(shí)間點(diǎn)的數據一致性不能保證。
另一種方案是 MySQL Server Exporter 和 Node Exporter 采用的,也是 Prometheus 官方推薦的方案。該方案是在每次接到 Prometheus Server 的懇求時(shí),初始化新的監控指標,開(kāi)啟一個(gè)取樣解釋器。和方案一不同的是,這些監控指標只在懇求期間存活。然后取樣解釋器會(huì )去采集所有樣本數據并返回給 Prometheus Server。相比于方案一,方案二的數據是即時(shí)拉取的,可以保證時(shí)間點(diǎn)的數據一致性;因為監控指標會(huì )在每次懇求時(shí)重新初始化,所以也不會(huì )存在失效的樣本數據。不過(guò)方案二同樣有不足之處:
1. 當多個(gè)拉取懇求同時(shí)發(fā)生時(shí),需要控制并發(fā)采集樣本的資源消耗;
2. 當多個(gè)拉取懇求同時(shí)發(fā)生時(shí),在短時(shí)間內須要對同一個(gè)監控指標讀取多次,對于一個(gè)變化頻度較低的監控指標來(lái)說(shuō),多次讀取意義不大,卻降低了對資源的占用。
相關(guān)內容方面的知識,大家還有哪些疑惑或則想知道的嗎?趕緊留言告訴小編吧! 查看全部
第04期:Prometheus 數據采集(三)

本期作者:羅韋
愛(ài)可生上海研發(fā)中心成員,研發(fā)工程師,主要負責 DMP 平臺監控告警功能的相關(guān)工作。
Prometheus 的監控對象各式各樣,沒(méi)有統一標準。為了解決這個(gè)問(wèn)題,Prometheus 制定了一套監控規范,符合這個(gè)規范的樣本數據可以被 Prometheus 采集并解析樣本數據。Exporter 在 Prometheus 監控系統中是一個(gè)采集監控數據并通過(guò) Prometheus 監控規范對外提供數據的組件,針對不同的監控對象可以實(shí)現不同的 Exporter,這樣就解決了監控對象標準不一的問(wèn)題。從廣義上說(shuō),所有可以向 Prometheus 提供監控樣本數據的程序都可以稱(chēng)為 Exporter,Exporter 的實(shí)例也就是我們上期所說(shuō)的"target"。
Exporter 的運行方法Exporter 有兩種運行方法Exporter 接口數據規范
Exporter 通過(guò) HTTP 接口以文本方式向 Prometheus 暴露樣本數據,格式簡(jiǎn)單,沒(méi)有嵌套,可讀性強。每個(gè)監控指標對應的數據文本格式如下:
# HELP
# TYPE
{ =,=...}
{ =,=...}
...
# HELP x balabala
# TYPE x summary
x{quantile="0.5"} value1
x{quantile="0.9"} value2
x{quantile="0.99"} value3
x_sum sum(values)
x_count count(values)
# HELP x The temperature of cpu
# TYPE x histogram
x_bucket{le="20"} value1
x_bucket{le="50"} value2
x_bucket{le="70"} value3
x_bucket{le="+Inf"} count(values)
x_sum sum(values)
x_count count(values)
這樣的文本格式也有不足之處:
1. 文本內容可能過(guò)分繁瑣;
2. Prometheus 在解析時(shí)不能校準 HELP 和 TYPE 字段是否缺位,如果缺位 HELP 字段,這條樣本數據的來(lái)源可能就無(wú)法判定;如果缺位 TYPE 字段,Prometheus 對這條樣本數據的類(lèi)型就無(wú)從得悉;
3. 相比于 protobuf,Prometheus 使用的文本格式?jīng)]有做任何壓縮處理,解析成本較高。
MySQL Server Exporter
針對被廣泛使用的關(guān)系型數據庫 MySQL,Prometheus 官方提供了 MySQL Server Exporter,支持 MySQL 5.6 及以上版本,對于 5.6 以下的版本,部分監控指標可能不支持。
MySQL Server Exporter 監控的信息包括了常用的 global status/variables 信息、schema/table 的統計信息、user 統計信息、innodb 的信息以及主從復制、組復制的信息,監控指標比較全面。但是因為它提供的監控指標中缺乏對 MySQL 實(shí)例的標示,所以當一臺主機上存在多個(gè) MySQL 實(shí)例,需要運行多個(gè) MySQL Server Exporter 進(jìn)行監控時(shí),就會(huì )無(wú)法分辨實(shí)例信息。具體使用方法可參考:
Node Exporter
Prometheus 官方的 Node Exporter 提供對 *NIX 系統、硬件信息的監控,監控指標包括 CPU 使用率/配置、系統平均負載、內存信息、網(wǎng)絡(luò )狀況、文件系統信息統計、磁盤(pán)使用情況統計等。對于不同的系統,監控指標會(huì )有所差別,如 diskstats 支持 Darwin, Linux, OpenBSD 系統;loadavg 支持 Darwin, Dragonfly, FreeBSD, Linux, NetBSD, OpenBSD, Solaris 系統。Node Exporter 的監控指標沒(méi)有對主機身分的標示,可以通過(guò) relabel 功能在 Prometheus Server 端降低一些標示標簽。具體使用方法可參考:
如何實(shí)現一個(gè) Exporter編撰一個(gè)簡(jiǎn)單的 Exporter
使用 prometheus/client_golang 包,我們來(lái)編撰一個(gè)簡(jiǎn)單的 Exporter,包括 Prometheus 支持的四種監控指標類(lèi)型
package main
import (
"log"
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
//使用GaugeVec類(lèi)型可以為監控指標設置標簽,這里為監控指標增加一個(gè)標簽"device"
speed = prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "disk_available_bytes",
Help: "Disk space available in bytes",
}, []string{"device"})
tasksTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: "test_tasks_total",
Help: "Total number of test tasks",
})
taskDuration = prometheus.NewSummary(prometheus.SummaryOpts{
Name: "task_duration_seconds",
Help: "Duration of task in seconds",
//Summary類(lèi)型的監控指標需要提供分位點(diǎn)
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
})
cpuTemperature = prometheus.NewHistogram(prometheus.HistogramOpts{
Name: "cpu_temperature",
Help: "The temperature of cpu",
//Histogram類(lèi)型的監控指標需要提供Bucket
Buckets: []float64{20, 50, 70, 80},
})
)
func init() {
//注冊監控指標
prometheus.MustRegister(speed)
prometheus.MustRegister(tasksTotal)
prometheus.MustRegister(taskDuration)
prometheus.MustRegister(cpuTemperature)
}
func main() {
//模擬采集監控數據
fakeData()
//使用prometheus提供的promhttp.Handler()暴露監控樣本數據
//prometheus默認從"/metrics"接口拉取監控樣本數據
http.Handle("/metrics", promhttp.Handler())
log.Fatal(http.ListenAndServe(":10000", nil))
}
func fakeData() {
tasksTotal.Inc()
//設置該條樣本數據的"device"標簽值為"/dev/sda"
speed.With(prometheus.Labels{"device": "/dev/sda"}).Set(82115880)
taskDuration.Observe(10)
taskDuration.Observe(20)
taskDuration.Observe(30)
taskDuration.Observe(45)
taskDuration.Observe(56)
taskDuration.Observe(80)
cpuTemperature.Observe(30)
cpuTemperature.Observe(43)
cpuTemperature.Observe(56)
cpuTemperature.Observe(58)
cpuTemperature.Observe(65)
cpuTemperature.Observe(70)
}
接下來(lái)編譯、運行我們的 Exporter
GOOS=linux GOARCH=amd64 go build -o my_exporter main.go
./my_exporter &
Exporter 運行上去以后,還要在 Prometheus 的配置文件中加入 Exporter 信息,Prometheus 才能從 Exporter 拉取數據。
static_configs:
- targets: ['localhost:9090','172.17.0.3:10000']
在 Prometheus 的 targets 頁(yè)面可以看見(jiàn)剛剛新增的 Exporter 了

untitled.png
訪(fǎng)問(wèn)"/metrics"接口可以找到如下數據:
Gauge
因為我們使用了 GaugeVec,所以形成了帶標簽的樣本數據
# HELP disk_available_bytes disk space available in bytes
# TYPE disk_available_bytes gauge
disk_available_bytes{device="/dev/sda"} 8.211588e+07
Counter
# HELP test_tasks_total total number of test tasks
# TYPE test_tasks_total counter
test_tasks_total 1
Summary
# HELP task_duration_seconds Duration of task in seconds
# TYPE task_duration_seconds summary
task_duration_seconds{quantile="0.5"} 30
task_duration_seconds{quantile="0.9"} 80
task_duration_seconds{quantile="0.99"} 80
task_duration_seconds_sum 241
task_duration_seconds_count 6
Histogram
# HELP cpu_temperature The temperature of cpu
# TYPE cpu_temperature histogram
cpu_temperature_bucket{le="20"} 0
cpu_temperature_bucket{le="50"} 2
cpu_temperature_bucket{le="70"} 6
cpu_temperature_bucket{le="80"} 6
cpu_temperature_bucket{le="+Inf"} 6
cpu_temperature_sum 322
cpu_temperature_count 6
Exporter實(shí)現方法的審視
上面的板栗中,我們在程序一開(kāi)始就初始化所有的監控指標,這種方案一般接下來(lái)會(huì )開(kāi)啟一個(gè)取樣解釋器去定期采集、更新監控指標的樣本數據,最新的樣本數據將仍然保留在顯存中,在接到 Prometheus Server 的懇求時(shí),返回顯存里的樣本數據。這個(gè)方案的優(yōu)點(diǎn)在于,易于控制取樣頻度;不用害怕并發(fā)取樣可能帶來(lái)的資源占據問(wèn)題。不足之處有:
1. 由于樣本數據不會(huì )被手動(dòng)清除,當某個(gè)已被取樣的采集對象失效了,Prometheus Server 依然能拉取到它的樣本數據,只是這個(gè)數據從監控對象失效時(shí)就早已不會(huì )再被更新。這就須要 Exporter 自己提供一個(gè)對無(wú)效監控對象的數據清除機制;
2. 由于響應 Prometheus Server 的懇求是從顯存里取數據,如果 Exporter 的取樣解釋器異??ㄗ?,Prometheus Server 也難以感知,拉取到的數據可能是過(guò)期數據;
3. Prometheus Server 拉取的數據不是即時(shí)取樣的,對于某時(shí)間點(diǎn)的數據一致性不能保證。
另一種方案是 MySQL Server Exporter 和 Node Exporter 采用的,也是 Prometheus 官方推薦的方案。該方案是在每次接到 Prometheus Server 的懇求時(shí),初始化新的監控指標,開(kāi)啟一個(gè)取樣解釋器。和方案一不同的是,這些監控指標只在懇求期間存活。然后取樣解釋器會(huì )去采集所有樣本數據并返回給 Prometheus Server。相比于方案一,方案二的數據是即時(shí)拉取的,可以保證時(shí)間點(diǎn)的數據一致性;因為監控指標會(huì )在每次懇求時(shí)重新初始化,所以也不會(huì )存在失效的樣本數據。不過(guò)方案二同樣有不足之處:
1. 當多個(gè)拉取懇求同時(shí)發(fā)生時(shí),需要控制并發(fā)采集樣本的資源消耗;
2. 當多個(gè)拉取懇求同時(shí)發(fā)生時(shí),在短時(shí)間內須要對同一個(gè)監控指標讀取多次,對于一個(gè)變化頻度較低的監控指標來(lái)說(shuō),多次讀取意義不大,卻降低了對資源的占用。
相關(guān)內容方面的知識,大家還有哪些疑惑或則想知道的嗎?趕緊留言告訴小編吧!
Golddata怎么采集需要登入/會(huì )話(huà)的數據?
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 354 次瀏覽 ? 2020-08-14 14:05
點(diǎn)擊“采集管理》網(wǎng)站管理”,點(diǎn)擊“添加”按扭,添加名為mydict的站點(diǎn)。如下所示:
接下來(lái)配制登陸和檢測會(huì )話(huà)腳本,點(diǎn)擊“設置半自動(dòng)登陸”,會(huì )打開(kāi)站點(diǎn)半自動(dòng)登陸配制頁(yè)面,如下圖所示:
登錄腳本如下:
//發(fā)送ajax請求驗證碼
var va=$ajax('http://localhost:8080/code/vcode?timestamp=1554001708730',{encoding:false});
var arg_={
label:site.name+"驗證碼",
type:1,
content:va.content
}
//waitForInput內置函數將發(fā)送郵件,并等待輸入
//(回復郵件,或者goldData平臺輸入),
//并把輸入內容當作驗證碼返回。
var code=waitForInput(arg_);
var data="username=admin&password=admin&vcode="+code
var m=new Map()
m.put('Cookie',va.cookie)
//發(fā)送ajax請求執行登錄
var content=$ajax('http://localhost:8080/doLogin',{method:'POST',headers:m,data:data})
//如果正確,將返回狀態(tài)1(登錄成功),和headers信息給GoldData,
//否則返回0(登錄失?。?!
if(content.headers){
m.putAll(content.headers)
}
var ret={status:1,headers:m}
if(content.status!=200){
ret.status=0
}
ret
檢查腳本如下:
var ret=true;
if(html.contains("我的單詞-登錄")){
ret=false
}
ret;
配制好以后,我們回到網(wǎng)站管理頁(yè)面,點(diǎn)擊“啟動(dòng)登陸”,則會(huì )開(kāi)始執行“自動(dòng)登入”,這以后,點(diǎn)擊“查詢(xún)”按扭來(lái)刷新頁(yè)面,可以見(jiàn)到“等待輸入”的狀態(tài)。如下圖所示:
此時(shí),您設置的通知郵箱,也應當同時(shí)收到了電郵。點(diǎn)開(kāi)電郵,或者點(diǎn)擊頁(yè)面上的“錄入等待輸入”按扭,將會(huì )聽(tīng)到如下內容:
依據電郵內容,回復電郵“{{qcxe}}”,就可以使程序繼續執行。在golddata頁(yè)面里輸入"qcxe",效果是一樣的。程序將會(huì )回到“waitForInput()”,并且返回輸入的內容。
回復以后,我們將在golddata頁(yè)面里,點(diǎn)擊“查詢(xún)”刷新頁(yè)面,mydict的登陸狀態(tài)會(huì )變?yōu)椤耙训顷憽?。如下圖所示:
接下來(lái),我們可以定義抓取規則。
定義抓取規則
在添加規則之前,我們還須要定義類(lèi)似于表結構的數據集。如下圖所示:
接下來(lái),點(diǎn)擊“采集管理》規則管理”,添加規則,打開(kāi)添加規則頁(yè)面,如下圖所示:
抓取規則腳本如下:
[
{
__sample: http://localhost:8080/word/index?pageNum=2
match0: http\:\/\/localhost\:8080\/word\/index(\?pageNum=\d+)?
fields0:
{
__model: true
__dataset: word
__node: "#content ul >li"
sn:
{
expr: ""
attr: ""
js: md5(item.name)
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
name:
{
expr: h5
attr: ""
js: ""
__label: ""
__showOnList: true
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
uk:
{
expr: li span.uk
attr: ""
js: source.replace("uk: ",'')
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
us:
{
expr: li span.us
attr: ""
js: source.replace("us: ",'')
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
}
fields1:
{
__node: .pagination a
href:
{
expr: a
attr: abs:href
js: ""
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
}
}
]
然后點(diǎn)擊測試,將會(huì )進(jìn)行測試抓取。我們發(fā)覺(jué)數據的確被抓取到了,如下圖所示:
配制抓取器抓取
這和之前是一樣的,將抓取器設置抓取站點(diǎn)“mydict”.然后點(diǎn)擊開(kāi)始抓取。然后會(huì )在數據管理上面查看抓取的數據。
結論
GoldData半自動(dòng)登陸實(shí)質(zhì)是提供了一個(gè)可以人工介入來(lái)異步獲取會(huì )話(huà)的框架,既可以調用AI插口做到完全手動(dòng)登入;也可以將類(lèi)似于驗證碼須要復雜辨識須要提供輸入時(shí),直接將cookie或則token信息通過(guò)短信收發(fā)到GoldData平臺(這樣可以不管CAPTCHA多復雜 ),都可以使GoldData抓取數據的動(dòng)作持續進(jìn)行下去。 查看全部
編寫(xiě)登陸和檢測會(huì )話(huà)腳本
點(diǎn)擊“采集管理》網(wǎng)站管理”,點(diǎn)擊“添加”按扭,添加名為mydict的站點(diǎn)。如下所示:

接下來(lái)配制登陸和檢測會(huì )話(huà)腳本,點(diǎn)擊“設置半自動(dòng)登陸”,會(huì )打開(kāi)站點(diǎn)半自動(dòng)登陸配制頁(yè)面,如下圖所示:

登錄腳本如下:
//發(fā)送ajax請求驗證碼
var va=$ajax('http://localhost:8080/code/vcode?timestamp=1554001708730',{encoding:false});
var arg_={
label:site.name+"驗證碼",
type:1,
content:va.content
}
//waitForInput內置函數將發(fā)送郵件,并等待輸入
//(回復郵件,或者goldData平臺輸入),
//并把輸入內容當作驗證碼返回。
var code=waitForInput(arg_);
var data="username=admin&password=admin&vcode="+code
var m=new Map()
m.put('Cookie',va.cookie)
//發(fā)送ajax請求執行登錄
var content=$ajax('http://localhost:8080/doLogin',{method:'POST',headers:m,data:data})
//如果正確,將返回狀態(tài)1(登錄成功),和headers信息給GoldData,
//否則返回0(登錄失?。?!
if(content.headers){
m.putAll(content.headers)
}
var ret={status:1,headers:m}
if(content.status!=200){
ret.status=0
}
ret
檢查腳本如下:
var ret=true;
if(html.contains("我的單詞-登錄")){
ret=false
}
ret;
配制好以后,我們回到網(wǎng)站管理頁(yè)面,點(diǎn)擊“啟動(dòng)登陸”,則會(huì )開(kāi)始執行“自動(dòng)登入”,這以后,點(diǎn)擊“查詢(xún)”按扭來(lái)刷新頁(yè)面,可以見(jiàn)到“等待輸入”的狀態(tài)。如下圖所示:

此時(shí),您設置的通知郵箱,也應當同時(shí)收到了電郵。點(diǎn)開(kāi)電郵,或者點(diǎn)擊頁(yè)面上的“錄入等待輸入”按扭,將會(huì )聽(tīng)到如下內容:


依據電郵內容,回復電郵“{{qcxe}}”,就可以使程序繼續執行。在golddata頁(yè)面里輸入"qcxe",效果是一樣的。程序將會(huì )回到“waitForInput()”,并且返回輸入的內容。
回復以后,我們將在golddata頁(yè)面里,點(diǎn)擊“查詢(xún)”刷新頁(yè)面,mydict的登陸狀態(tài)會(huì )變?yōu)椤耙训顷憽?。如下圖所示:

接下來(lái),我們可以定義抓取規則。
定義抓取規則
在添加規則之前,我們還須要定義類(lèi)似于表結構的數據集。如下圖所示:

接下來(lái),點(diǎn)擊“采集管理》規則管理”,添加規則,打開(kāi)添加規則頁(yè)面,如下圖所示:

抓取規則腳本如下:
[
{
__sample: http://localhost:8080/word/index?pageNum=2
match0: http\:\/\/localhost\:8080\/word\/index(\?pageNum=\d+)?
fields0:
{
__model: true
__dataset: word
__node: "#content ul >li"
sn:
{
expr: ""
attr: ""
js: md5(item.name)
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
name:
{
expr: h5
attr: ""
js: ""
__label: ""
__showOnList: true
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
uk:
{
expr: li span.uk
attr: ""
js: source.replace("uk: ",'')
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
us:
{
expr: li span.us
attr: ""
js: source.replace("us: ",'')
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
}
fields1:
{
__node: .pagination a
href:
{
expr: a
attr: abs:href
js: ""
__label: ""
__showOnList: false
__type: ""
down: "0"
accessPathJs: ""
uploadConf: s1
}
}
}
]
然后點(diǎn)擊測試,將會(huì )進(jìn)行測試抓取。我們發(fā)覺(jué)數據的確被抓取到了,如下圖所示:

配制抓取器抓取
這和之前是一樣的,將抓取器設置抓取站點(diǎn)“mydict”.然后點(diǎn)擊開(kāi)始抓取。然后會(huì )在數據管理上面查看抓取的數據。
結論
GoldData半自動(dòng)登陸實(shí)質(zhì)是提供了一個(gè)可以人工介入來(lái)異步獲取會(huì )話(huà)的框架,既可以調用AI插口做到完全手動(dòng)登入;也可以將類(lèi)似于驗證碼須要復雜辨識須要提供輸入時(shí),直接將cookie或則token信息通過(guò)短信收發(fā)到GoldData平臺(這樣可以不管CAPTCHA多復雜 ),都可以使GoldData抓取數據的動(dòng)作持續進(jìn)行下去。
python爬蟲(chóng)實(shí)踐教學(xué)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 619 次瀏覽 ? 2020-08-13 14:47
一、前言
這篇文章之前是給新人培訓時(shí)用的,大家覺(jué)的很好理解的,所以就分享下來(lái),與你們一起學(xué)習。如果你學(xué)過(guò)一些python,想用它做些什么又沒(méi)有方向,不妨試試完成下邊幾個(gè)案例。
二、環(huán)境打算
安裝requests lxml beautifulsoup4三個(gè)庫(下面代碼均在python3.5環(huán)境下通過(guò)測試)
pip install requests lxml beautifulsoup4
三、幾個(gè)爬蟲(chóng)小案例3.1 獲取本機公網(wǎng)IP地址
利用公網(wǎng)上查詢(xún)IP的托詞,使用python的requests庫,自動(dòng)獲取IP地址。
import requests
r = requests.get("http://2017.ip138.com/ic.asp")
r.encoding = r.apparent_encoding? ?? ???#使用requests的字符編碼智能分析,避免中文亂碼
print(r.text)
# 你還可以使用正則匹配re模塊提取出IP
import re
print(re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",r.text))
3.2 利用百度搜索插口,編寫(xiě)url采集器
這個(gè)案例中,我們要使用requests結合BeautifulSoup庫來(lái)完成任務(wù)。我們要在程序中設置User-Agent頭,繞過(guò)百度搜索引擎的反爬蟲(chóng)機制(你可以試試不加User-Agent頭,看看能不能獲取到數據)。注意觀(guān)察百度搜索結構的URL鏈接規律,例如第一頁(yè)的url鏈接參數pn=0,第二頁(yè)的url鏈接參數pn=10…. 依次類(lèi)推。這里,我們使用css選擇器路徑提取數據。
import requests
from bs4 import BeautifulSoup
# 設置User-Agent頭,繞過(guò)百度搜索引擎的反爬蟲(chóng)機制
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'}
# 注意觀(guān)察百度搜索結構的URL鏈接規律,例如第一頁(yè)pn=0,第二頁(yè)pn=10.... 依次類(lèi)推,下面的for循環(huán)搜索前10頁(yè)結果
for i in range(0,100,10):
? ?? ???bd_search = "https://www.baidu.com/s%3Fwd%3 ... ot%3B % str(i)
? ?? ???r = requests.get(bd_search,headers=headers)
? ?? ???soup = BeautifulSoup(r.text,"lxml")
? ? # 下面的select使用了css選擇器路徑提取數據
? ?? ???url_list = soup.select(".t > a")
? ?? ???for url in url_list:
? ?? ?? ?? ?? ? real_url = url["href"]
? ?? ?? ?? ?? ? r = requests.get(real_url)
? ?? ?? ?? ?? ? print(r.url)
編寫(xiě)好程序后,我們使用關(guān)鍵詞inurl:/dede/login.php來(lái)批量提取織夢(mèng)cms的后臺地址,效果如下:
3.3 自動(dòng)下載搜狗壁紙
這個(gè)反例,我們將通過(guò)爬蟲(chóng)來(lái)手動(dòng)下載搜過(guò)墻紙,程序中儲存圖片的路徑改成你自己想要儲存圖片的目錄路徑即可。還有一點(diǎn),程序中我們用到了json庫,這是因為在觀(guān)察中,發(fā)現搜狗壁紙的地址是以json格式儲存,所以我們以json來(lái)解析這組數據。
import requests
import json
#下載圖片
url = "http://pic.sogou.com/pics/chan ... ot%3B
r = requests.get(url)
data = json.loads(r.text)
for i in data["all_items"]:
? ? img_url = i["pic_url"]
? ? # 下面這行里面的路徑改成你自己想要存放圖片的目錄路徑即可
? ? with open("/home/evilk0/Desktop/img/%s" % img_url[-10:]+".jpg","wb") as f:
? ?? ???r2 = requests.get(img_url)
? ?? ???f.write(r2.content)
? ? print("下載完畢:",img_url)
3.4 自動(dòng)填寫(xiě)調查問(wèn)卷
目標官網(wǎng):
目標問(wèn)卷:
import requests
import random
url = "https://www.wjx.cn/joinnew/pro ... ot%3B
data = {
? ? "submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
}
header = {
? ? "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)",
? ? "Cookie": ".ASPXANONYMOUS=iBuvxgz20wEkAAAAZGY4MDE1MjctNWU4Ni00MDUwLTgwYjQtMjFhMmZhMDE2MTA3h_bb3gNw4XRPsyh-qPh4XW1mfJ41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; UM_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100CBE37C329C8A3EEEEE289B573446F594297CC3BB3C355F09187F5ADCC492EBB07A9CC65CD43AD3E795C914CD57017EE3799E92F0E2762C963EF0912; WjxUser=UserName=17750277425&Type=1; LastCheckUpdateDate=1; LastCheckDesign=1; DeleteQCookie=1; _cnzz_CV4478442=%E7%94%A8%E6%88%B7%E7%89%88%E6%9C%AC%7C%E5%85%8D%E8%B4%B9%E7%89%88%7C1521461468568; jac21581199=78751211; CNZZDATA4478442=cnzz_eid%3D878068609-1521456533-https%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1521461319; Hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; Hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471",
}
for i in range(0,500):
? ? choice = (
? ?? ???random.randint(1, 2),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ? )
? ? data["submitdata"] = data["submitdata"] % choice
? ? r = requests.post(url = url,headers=header,data=data)
? ? print(r.text)
? ? data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
當我們使用同一個(gè)IP遞交多個(gè)問(wèn)卷時(shí),會(huì )觸發(fā)目標的反爬蟲(chóng)機制,服務(wù)器會(huì )出現驗證碼。
我們可以使用X-Forwarded-For來(lái)偽造我們的IP,修改后代碼如下:
import requests
import random
url = "https://www.wjx.cn/joinnew/pro ... ot%3B
data = {
? ? "submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
}
header = {
? ? "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)",
? ? "Cookie": ".ASPXANONYMOUS=iBuvxgz20wEkAAAAZGY4MDE1MjctNWU4Ni00MDUwLTgwYjQtMjFhMmZhMDE2MTA3h_bb3gNw4XRPsyh-qPh4XW1mfJ41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; UM_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100CBE37C329C8A3EEEEE289B573446F594297CC3BB3C355F09187F5ADCC492EBB07A9CC65CD43AD3E795C914CD57017EE3799E92F0E2762C963EF0912; WjxUser=UserName=17750277425&Type=1; LastCheckUpdateDate=1; LastCheckDesign=1; DeleteQCookie=1; _cnzz_CV4478442=%E7%94%A8%E6%88%B7%E7%89%88%E6%9C%AC%7C%E5%85%8D%E8%B4%B9%E7%89%88%7C1521461468568; jac21581199=78751211; CNZZDATA4478442=cnzz_eid%3D878068609-1521456533-https%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1521461319; Hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; Hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471",
? ? "X-Forwarded-For" : "%s"
}
for i in range(0,500):
? ? choice = (
? ?? ???random.randint(1, 2),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ? )
? ? data["submitdata"] = data["submitdata"] % choice
? ? header["X-Forwarded-For"] = (str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+str(random.randint(1,255))
? ? r = requests.post(url = url,headers=header,data=data)
? ? print(header["X-Forwarded-For"],r.text)
? ? data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
? ? header["X-Forwarded-For"] = "%s"
效果圖:
關(guān)于這篇文章,因為之前寫(xiě)過(guò),不贅言,感興趣直接看:【如何通過(guò)Python實(shí)現手動(dòng)填寫(xiě)調查問(wèn)卷】
3.5 獲取網(wǎng)段代理IP,并判定是否能用、延遲時(shí)間
這一個(gè)事例中,我們想爬取【西刺代理】上的代理IP,并驗證這種代理的存活性以及延后時(shí)間。(你可以將爬取的代理IP添加進(jìn)proxychain中,然后進(jìn)行平時(shí)的滲透任務(wù)。)這里,我直接調用了linux的系統命令ping -c 1 " + ip.string + " | awk 'NR==2{print}' -,如果你想在Windows中運行這個(gè)程序,需要更改倒數第三行os.popen中的命令,改成Windows可以執行的即可。
from bs4 import BeautifulSoup
import requests
import os
url = "http://www.xicidaili.com/nn/1"
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
r = requests.get(url=url,headers=headers)
soup = BeautifulSoup(r.text,"lxml")
server_address = soup.select(".odd > td:nth-of-type(4)")
ip_list = soup.select(".odd > td:nth-of-type(2)")
ports = soup.select(".odd > td:nth-of-type(3)")
for server,ip in zip(server_address,ip_list):
? ? if len(server.contents) != 1:
? ?? ???print(server.a.string.ljust(8),ip.string.ljust(20), end='')
? ? else:
? ?? ???print("未知".ljust(8), ip.string.ljust(20), end='')
? ? delay_time = os.popen("ping -c 1 " + ip.string + " | awk 'NR==2{print}' -")
? ? delay_time = delay_time.read().split("time=")[-1].strip("\r\n")
? ? print("time = " + delay_time)
四、結語(yǔ)
當然,你還可以用python干好多有趣的事情。如果里面的那些反例你看的不是太懂,那我最后在送上一套python爬蟲(chóng)視頻教程:【Python網(wǎng)絡(luò )爬蟲(chóng)與信息提取】?,F在網(wǎng)路上的學(xué)習真的好多,希望你們就能好好借助。
有問(wèn)題你們可以留言哦,也歡迎你們到春秋峰會(huì )中來(lái)耍一耍>>>點(diǎn)擊跳轉 查看全部
i春秋詩(shī)人:Mochazz
一、前言
這篇文章之前是給新人培訓時(shí)用的,大家覺(jué)的很好理解的,所以就分享下來(lái),與你們一起學(xué)習。如果你學(xué)過(guò)一些python,想用它做些什么又沒(méi)有方向,不妨試試完成下邊幾個(gè)案例。
二、環(huán)境打算
安裝requests lxml beautifulsoup4三個(gè)庫(下面代碼均在python3.5環(huán)境下通過(guò)測試)
pip install requests lxml beautifulsoup4

三、幾個(gè)爬蟲(chóng)小案例3.1 獲取本機公網(wǎng)IP地址
利用公網(wǎng)上查詢(xún)IP的托詞,使用python的requests庫,自動(dòng)獲取IP地址。
import requests
r = requests.get("http://2017.ip138.com/ic.asp")
r.encoding = r.apparent_encoding? ?? ???#使用requests的字符編碼智能分析,避免中文亂碼
print(r.text)
# 你還可以使用正則匹配re模塊提取出IP
import re
print(re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",r.text))

3.2 利用百度搜索插口,編寫(xiě)url采集器
這個(gè)案例中,我們要使用requests結合BeautifulSoup庫來(lái)完成任務(wù)。我們要在程序中設置User-Agent頭,繞過(guò)百度搜索引擎的反爬蟲(chóng)機制(你可以試試不加User-Agent頭,看看能不能獲取到數據)。注意觀(guān)察百度搜索結構的URL鏈接規律,例如第一頁(yè)的url鏈接參數pn=0,第二頁(yè)的url鏈接參數pn=10…. 依次類(lèi)推。這里,我們使用css選擇器路徑提取數據。
import requests
from bs4 import BeautifulSoup
# 設置User-Agent頭,繞過(guò)百度搜索引擎的反爬蟲(chóng)機制
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'}
# 注意觀(guān)察百度搜索結構的URL鏈接規律,例如第一頁(yè)pn=0,第二頁(yè)pn=10.... 依次類(lèi)推,下面的for循環(huán)搜索前10頁(yè)結果
for i in range(0,100,10):
? ?? ???bd_search = "https://www.baidu.com/s%3Fwd%3 ... ot%3B % str(i)
? ?? ???r = requests.get(bd_search,headers=headers)
? ?? ???soup = BeautifulSoup(r.text,"lxml")
? ? # 下面的select使用了css選擇器路徑提取數據
? ?? ???url_list = soup.select(".t > a")
? ?? ???for url in url_list:
? ?? ?? ?? ?? ? real_url = url["href"]
? ?? ?? ?? ?? ? r = requests.get(real_url)
? ?? ?? ?? ?? ? print(r.url)
編寫(xiě)好程序后,我們使用關(guān)鍵詞inurl:/dede/login.php來(lái)批量提取織夢(mèng)cms的后臺地址,效果如下:

3.3 自動(dòng)下載搜狗壁紙
這個(gè)反例,我們將通過(guò)爬蟲(chóng)來(lái)手動(dòng)下載搜過(guò)墻紙,程序中儲存圖片的路徑改成你自己想要儲存圖片的目錄路徑即可。還有一點(diǎn),程序中我們用到了json庫,這是因為在觀(guān)察中,發(fā)現搜狗壁紙的地址是以json格式儲存,所以我們以json來(lái)解析這組數據。
import requests
import json
#下載圖片
url = "http://pic.sogou.com/pics/chan ... ot%3B
r = requests.get(url)
data = json.loads(r.text)
for i in data["all_items"]:
? ? img_url = i["pic_url"]
? ? # 下面這行里面的路徑改成你自己想要存放圖片的目錄路徑即可
? ? with open("/home/evilk0/Desktop/img/%s" % img_url[-10:]+".jpg","wb") as f:
? ?? ???r2 = requests.get(img_url)
? ?? ???f.write(r2.content)
? ? print("下載完畢:",img_url)

3.4 自動(dòng)填寫(xiě)調查問(wèn)卷
目標官網(wǎng):
目標問(wèn)卷:
import requests
import random
url = "https://www.wjx.cn/joinnew/pro ... ot%3B
data = {
? ? "submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
}
header = {
? ? "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)",
? ? "Cookie": ".ASPXANONYMOUS=iBuvxgz20wEkAAAAZGY4MDE1MjctNWU4Ni00MDUwLTgwYjQtMjFhMmZhMDE2MTA3h_bb3gNw4XRPsyh-qPh4XW1mfJ41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; UM_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100CBE37C329C8A3EEEEE289B573446F594297CC3BB3C355F09187F5ADCC492EBB07A9CC65CD43AD3E795C914CD57017EE3799E92F0E2762C963EF0912; WjxUser=UserName=17750277425&Type=1; LastCheckUpdateDate=1; LastCheckDesign=1; DeleteQCookie=1; _cnzz_CV4478442=%E7%94%A8%E6%88%B7%E7%89%88%E6%9C%AC%7C%E5%85%8D%E8%B4%B9%E7%89%88%7C1521461468568; jac21581199=78751211; CNZZDATA4478442=cnzz_eid%3D878068609-1521456533-https%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1521461319; Hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; Hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471",
}
for i in range(0,500):
? ? choice = (
? ?? ???random.randint(1, 2),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ? )
? ? data["submitdata"] = data["submitdata"] % choice
? ? r = requests.post(url = url,headers=header,data=data)
? ? print(r.text)
? ? data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
當我們使用同一個(gè)IP遞交多個(gè)問(wèn)卷時(shí),會(huì )觸發(fā)目標的反爬蟲(chóng)機制,服務(wù)器會(huì )出現驗證碼。


我們可以使用X-Forwarded-For來(lái)偽造我們的IP,修改后代碼如下:
import requests
import random
url = "https://www.wjx.cn/joinnew/pro ... ot%3B
data = {
? ? "submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
}
header = {
? ? "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)",
? ? "Cookie": ".ASPXANONYMOUS=iBuvxgz20wEkAAAAZGY4MDE1MjctNWU4Ni00MDUwLTgwYjQtMjFhMmZhMDE2MTA3h_bb3gNw4XRPsyh-qPh4XW1mfJ41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; UM_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100CBE37C329C8A3EEEEE289B573446F594297CC3BB3C355F09187F5ADCC492EBB07A9CC65CD43AD3E795C914CD57017EE3799E92F0E2762C963EF0912; WjxUser=UserName=17750277425&Type=1; LastCheckUpdateDate=1; LastCheckDesign=1; DeleteQCookie=1; _cnzz_CV4478442=%E7%94%A8%E6%88%B7%E7%89%88%E6%9C%AC%7C%E5%85%8D%E8%B4%B9%E7%89%88%7C1521461468568; jac21581199=78751211; CNZZDATA4478442=cnzz_eid%3D878068609-1521456533-https%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1521461319; Hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; Hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471",
? ? "X-Forwarded-For" : "%s"
}
for i in range(0,500):
? ? choice = (
? ?? ???random.randint(1, 2),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 4),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ?? ???random.randint(1, 3),
? ? )
? ? data["submitdata"] = data["submitdata"] % choice
? ? header["X-Forwarded-For"] = (str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+str(random.randint(1,255))
? ? r = requests.post(url = url,headers=header,data=data)
? ? print(header["X-Forwarded-For"],r.text)
? ? data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
? ? header["X-Forwarded-For"] = "%s"
效果圖:



關(guān)于這篇文章,因為之前寫(xiě)過(guò),不贅言,感興趣直接看:【如何通過(guò)Python實(shí)現手動(dòng)填寫(xiě)調查問(wèn)卷】
3.5 獲取網(wǎng)段代理IP,并判定是否能用、延遲時(shí)間
這一個(gè)事例中,我們想爬取【西刺代理】上的代理IP,并驗證這種代理的存活性以及延后時(shí)間。(你可以將爬取的代理IP添加進(jìn)proxychain中,然后進(jìn)行平時(shí)的滲透任務(wù)。)這里,我直接調用了linux的系統命令ping -c 1 " + ip.string + " | awk 'NR==2{print}' -,如果你想在Windows中運行這個(gè)程序,需要更改倒數第三行os.popen中的命令,改成Windows可以執行的即可。
from bs4 import BeautifulSoup
import requests
import os
url = "http://www.xicidaili.com/nn/1"
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
r = requests.get(url=url,headers=headers)
soup = BeautifulSoup(r.text,"lxml")
server_address = soup.select(".odd > td:nth-of-type(4)")
ip_list = soup.select(".odd > td:nth-of-type(2)")
ports = soup.select(".odd > td:nth-of-type(3)")
for server,ip in zip(server_address,ip_list):
? ? if len(server.contents) != 1:
? ?? ???print(server.a.string.ljust(8),ip.string.ljust(20), end='')
? ? else:
? ?? ???print("未知".ljust(8), ip.string.ljust(20), end='')
? ? delay_time = os.popen("ping -c 1 " + ip.string + " | awk 'NR==2{print}' -")
? ? delay_time = delay_time.read().split("time=")[-1].strip("\r\n")
? ? print("time = " + delay_time)


四、結語(yǔ)
當然,你還可以用python干好多有趣的事情。如果里面的那些反例你看的不是太懂,那我最后在送上一套python爬蟲(chóng)視頻教程:【Python網(wǎng)絡(luò )爬蟲(chóng)與信息提取】?,F在網(wǎng)路上的學(xué)習真的好多,希望你們就能好好借助。
有問(wèn)題你們可以留言哦,也歡迎你們到春秋峰會(huì )中來(lái)耍一耍>>>點(diǎn)擊跳轉
假如你早已開(kāi)始學(xué)python,對爬蟲(chóng)沒(méi)有頭緒,不妨瞧瞧這幾個(gè)案例!
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 239 次瀏覽 ? 2020-08-13 14:23
一、論述
這幾個(gè)案例曾經(jīng)是給一些想步入Python行業(yè)的同事寫(xiě)的,看到你們都比較滿(mǎn)意,所以就再度拿了下來(lái),如果你早已開(kāi)始學(xué)python,對爬蟲(chóng)沒(méi)有頭緒,不妨瞧瞧這幾個(gè)案例,文末更多分享!
二、環(huán)境打算
Python 3
requests庫 、lxml庫、beautifulsoup4庫
pip install XX XX XX一并安裝。
在這里相信有許多想要學(xué)習Python的朋友,大家可以+下Python學(xué)習分享褲:叁零肆+零伍零+柒玖玖,即可免費發(fā)放一整套系統的 Python學(xué)習教程
三、Python爬蟲(chóng)小案例
1、獲取本機的公網(wǎng)IP地址
利用python的requests庫+公網(wǎng)上查IP的插口,自動(dòng)獲取IP地址
2、利用百度的查找插口,Python編撰url采集工具
需要用到requests庫、BeautifulSoup庫,觀(guān)察百度搜索結構的URL鏈接規律,繞過(guò)百度搜索引擎的反爬蟲(chóng)機制的方式為在程序中設置User-Agent懇求頭。
Python源代碼:
Python語(yǔ)言編撰好程序后,利用關(guān)鍵詞inurl:/dede/login.php 來(lái)批量提取某網(wǎng)cms的后臺地址:
3、利用Python構建搜狗壁紙手動(dòng)下載爬蟲(chóng)
搜狗壁紙的地址是json格式,所以用json庫解析這組數據,爬蟲(chóng)程序儲存圖片的c盤(pán)路徑改成欲存圖片的路徑就可以了。
效果圖:
4、Python手動(dòng)填寫(xiě)問(wèn)卷調查
與通常網(wǎng)頁(yè)一樣,多次遞交數據會(huì )要輸入驗證碼,這就是反爬機制。
如圖:
那么怎么繞開(kāi)驗證碼的反爬舉措?利用X-Forwarded-For偽造IP地址訪(fǎng)問(wèn)即可,Python代碼如下:
效果:
5、獲取南刺代理上的IP,驗證這種代理被封禁掉的可能性與延后時(shí)間
可以把Python爬取的代理IP添加到proxychain上面,就可以進(jìn)行通常的滲透任務(wù)了。這里直接調用了linux的系統命令ping -c 1 " + ip.string + " | awk 'NR==2{print}' - ,在Windows中運行此程序須要更改倒數第三行os.popen里的命令,修改為Windows才能執行的就可以了。
爬取到的數據如圖:
演示:
結論
其實(shí)我們能否用python做許多特別有趣的事。假如說(shuō)里面的爬蟲(chóng)小案例無(wú)法夠完全理解,那我最后再送上一套python爬蟲(chóng)手把手系列的視頻教程,私信小編007即可手動(dòng)獲取。 查看全部
一、論述
這幾個(gè)案例曾經(jīng)是給一些想步入Python行業(yè)的同事寫(xiě)的,看到你們都比較滿(mǎn)意,所以就再度拿了下來(lái),如果你早已開(kāi)始學(xué)python,對爬蟲(chóng)沒(méi)有頭緒,不妨瞧瞧這幾個(gè)案例,文末更多分享!
二、環(huán)境打算
Python 3
requests庫 、lxml庫、beautifulsoup4庫
pip install XX XX XX一并安裝。
在這里相信有許多想要學(xué)習Python的朋友,大家可以+下Python學(xué)習分享褲:叁零肆+零伍零+柒玖玖,即可免費發(fā)放一整套系統的 Python學(xué)習教程
三、Python爬蟲(chóng)小案例
1、獲取本機的公網(wǎng)IP地址
利用python的requests庫+公網(wǎng)上查IP的插口,自動(dòng)獲取IP地址
2、利用百度的查找插口,Python編撰url采集工具
需要用到requests庫、BeautifulSoup庫,觀(guān)察百度搜索結構的URL鏈接規律,繞過(guò)百度搜索引擎的反爬蟲(chóng)機制的方式為在程序中設置User-Agent懇求頭。
Python源代碼:
Python語(yǔ)言編撰好程序后,利用關(guān)鍵詞inurl:/dede/login.php 來(lái)批量提取某網(wǎng)cms的后臺地址:
3、利用Python構建搜狗壁紙手動(dòng)下載爬蟲(chóng)
搜狗壁紙的地址是json格式,所以用json庫解析這組數據,爬蟲(chóng)程序儲存圖片的c盤(pán)路徑改成欲存圖片的路徑就可以了。
效果圖:
4、Python手動(dòng)填寫(xiě)問(wèn)卷調查
與通常網(wǎng)頁(yè)一樣,多次遞交數據會(huì )要輸入驗證碼,這就是反爬機制。
如圖:
那么怎么繞開(kāi)驗證碼的反爬舉措?利用X-Forwarded-For偽造IP地址訪(fǎng)問(wèn)即可,Python代碼如下:
效果:
5、獲取南刺代理上的IP,驗證這種代理被封禁掉的可能性與延后時(shí)間
可以把Python爬取的代理IP添加到proxychain上面,就可以進(jìn)行通常的滲透任務(wù)了。這里直接調用了linux的系統命令ping -c 1 " + ip.string + " | awk 'NR==2{print}' - ,在Windows中運行此程序須要更改倒數第三行os.popen里的命令,修改為Windows才能執行的就可以了。
爬取到的數據如圖:
演示:
結論
其實(shí)我們能否用python做許多特別有趣的事。假如說(shuō)里面的爬蟲(chóng)小案例無(wú)法夠完全理解,那我最后再送上一套python爬蟲(chóng)手把手系列的視頻教程,私信小編007即可手動(dòng)獲取。
紅包搞笑html網(wǎng)頁(yè)源碼與織夢(mèng)智能采集俠下載評論軟件詳情對比
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 352 次瀏覽 ? 2020-08-10 01:56
織夢(mèng)智能采集俠功能
1、一鍵安裝,全手動(dòng)采集
織夢(mèng)采集俠安裝非常簡(jiǎn)單便捷,只需一分鐘,立即開(kāi)始采集,而且結合簡(jiǎn)單、健壯、靈活、開(kāi)源的dedecms程序,新手也能快速上手,而且我們還有專(zhuān)門(mén)的客服為商業(yè)顧客提供技術(shù)支持。
2、一詞采集,無(wú)須編撰采集規則
和傳統的采集模式不同的是織夢(mèng)采集俠可以依據用戶(hù)設定的關(guān)鍵詞進(jìn)行泛采集,泛采集的優(yōu)勢在于通過(guò)采集該關(guān)鍵詞的不同搜索結果,實(shí)現不對指定的一個(gè)或幾個(gè)被采集站點(diǎn)進(jìn)行采集,減少采集站點(diǎn)被搜索引擎判斷為鏡像站點(diǎn)被搜索引擎懲罰的危險。
3、RSS采集,輸入RSS地址即可采集內容
只要被采集的網(wǎng)站提供RSS訂閱地址,即可通過(guò)RSS進(jìn)行采集,只須要輸入RSS地址即可便捷的 采集到目標網(wǎng)站內容,無(wú)需編撰采集規則,方便簡(jiǎn)單。
4、定向采集,精確采集標題、正文、作者、來(lái)源
定向采集只須要提供列表URL和文章URL即可智能采集指定網(wǎng)站或欄目?jì)热?,方便?jiǎn)單,編寫(xiě)簡(jiǎn)單規則便可精確采集標題、正文、作者、來(lái)源。
5、 多種偽原創(chuàng )及優(yōu)化方法,提高收錄率及排行
自動(dòng)標題、段落重排、高級混淆、自動(dòng)內鏈、內容過(guò)濾、網(wǎng)址過(guò)濾、同義詞替換、插入seo成語(yǔ)、關(guān)鍵詞添加鏈接等多種方式手段對采集回來(lái)的文章加工處理,增強采集文章原創(chuàng )性,利于搜索引擎優(yōu)化,提高搜索引擎收錄、網(wǎng)站權重及關(guān)鍵詞排行。
6、插件全手動(dòng)采集,無(wú)需人工干預
織夢(mèng)采集俠根據預先設定是采集任務(wù),根據所設定的采集方式采集網(wǎng)址,然后手動(dòng)抓取網(wǎng)頁(yè)內容,程序通過(guò)精確估算剖析網(wǎng)頁(yè),丟棄掉不是文章內容頁(yè)的網(wǎng)址,提取出優(yōu)秀文章內容,最后進(jìn)行偽原創(chuàng ),導入,生成,這一切操作程序都是全手動(dòng)完成,無(wú)需人工干預。
7、手工發(fā)布文章亦可偽原創(chuàng )和搜索優(yōu)化處理
織夢(mèng)采集俠并不僅僅是一款采集插件,更是一款織夢(mèng)必備偽原創(chuàng )及搜索優(yōu)化插件,手工發(fā)布的文章可以經(jīng)過(guò)織夢(mèng)采集俠的偽原創(chuàng )和搜索優(yōu)化處理,可以對文章進(jìn)行同義詞替換,自動(dòng)內鏈,隨機插入關(guān)鍵詞鏈接和文章內收錄關(guān)鍵詞將手動(dòng)添加指定鏈接等功能,是一款織夢(mèng)必備插件。
8、定時(shí)定量進(jìn)行采集偽原創(chuàng )SEO更新
插件有兩個(gè)觸發(fā)采集方式,一種是在頁(yè)面內添加代碼由用戶(hù)訪(fǎng)問(wèn)觸發(fā)采集更新,另外種我們?yōu)樯虡I(yè)用戶(hù)提供的遠程觸發(fā)采集服務(wù),新站無(wú)有人訪(fǎng)問(wèn)即可定時(shí)定量采集更新,無(wú)需人工干預。
9、定時(shí)定量更新待初審文稿
縱使你數據庫上面有成千上萬(wàn)篇文章,織夢(mèng)采集俠亦可按照您的須要每晚在您設置的時(shí)間段內定時(shí)定量初審更新。
10、綁定織夢(mèng)采集節點(diǎn),定時(shí)采集偽原創(chuàng )SEO更新
綁定織夢(mèng)采集節點(diǎn)的功能,讓織夢(mèng)CMS自帶的采集功能也能定時(shí)手動(dòng)采集更新。方便早已設置了采集規則的用戶(hù)定時(shí)采集更新。
織夢(mèng)智能采集俠破解說(shuō)明
織夢(mèng)采集俠采集版分UTF8和GBK兩個(gè)版本,根據自己使用的dedecms版本來(lái)選擇!
因文件是用mac系統打包的,會(huì )自帶_MACOSX、.DS_Store文件,不影響使用,有強迫癥的可以刪掉。覆蓋破解文件的時(shí)侯不用管這種文件。
1,【您自行去采集俠官方下載最新v2.8版本(網(wǎng)址: 如果官網(wǎng)不能打開(kāi)就用我備份好的,解壓后有個(gè)采集俠官方插件文件夾,自行選擇安裝對應的版本),然后安裝到您的織夢(mèng)后臺,如果之前安裝過(guò)2.7版本,請先刪掉!】
2,注意安裝的時(shí)侯版本千萬(wàn)不要選錯了,UTF8就裝UTF8,GBK就用GBK的不要混用!
3,【覆蓋破解文件】(共三個(gè)文件CaiJiXia、include和Plugins)
Plugins : 直接覆蓋到網(wǎng)站的根目錄
include : 直接覆蓋到網(wǎng)站的根目錄
CaiJiXia: 網(wǎng)站默認后臺是dede,如果你沒(méi)有更改后臺目錄的話(huà)那就是覆蓋 /dede/apps/下面,如果后臺訪(fǎng)問(wèn)路徑被更改過(guò)的話(huà),那就把dede換成你更改的名稱(chēng)。例:dede已更改成test, 那就覆蓋/test/apps/目錄下
4,【破解程序使用對域名無(wú)限制】
5, 【覆蓋后須要清除下瀏覽器緩存, 推薦使用微軟或則火狐瀏覽器,不要用IE內核瀏覽器,清理緩存有時(shí)清的不干凈】
6, PHP版本必須5.3+
織夢(mèng)智能采集俠使用方式
1、設置定向采集
1)、登錄您網(wǎng)站后臺,模塊->采集俠->采集任務(wù),如果您的網(wǎng)站還沒(méi)有添加欄目,你須要先到織夢(mèng)的欄目管理里先添加欄目,如果早已添加了欄目,你可能可以看見(jiàn)如下界面
2)、在彈出的頁(yè)面里選擇定向采集,如圖所示
3)、點(diǎn)擊添加采集規則
2、設置 目標頁(yè)面編碼
打開(kāi)您要采集的網(wǎng)頁(yè),點(diǎn)擊滑鼠右鍵,點(diǎn)擊查看網(wǎng)站源碼,搜索charset,查看charset前面緊隨的是utf-8還是gb2312
3、設置 列表網(wǎng)址
列表網(wǎng)址就是您要采集的網(wǎng)站的欄目列表地址
如果只是單純采集列表頁(yè)的第一頁(yè),直接輸入該列表URL就行,如我要采集站長(cháng)之家的優(yōu)化欄目的第一頁(yè),那列表URL就輸入:,即可。采集第一頁(yè)的內容的益處就是可以不用采集老舊的新聞,而且有新更新也可以及時(shí)采集到,如果須要采集該欄目的所有內容,那也可以通過(guò)設置鍵值的方法,匹配所有列表URL規則。
織夢(mèng)智能采集俠常見(jiàn)問(wèn)題
綁定x個(gè)域名授權是哪些意思呢?
多少個(gè)域名授權,就是多少個(gè)網(wǎng)站可以使用織夢(mèng)采集俠商業(yè)版。
插件可以指定網(wǎng)站進(jìn)行采集嗎?
插件不僅可以按照關(guān)鍵詞采集外,還有RSS和頁(yè)面監控采集這兩種采集方式,可以指定網(wǎng)站進(jìn)行采集。
如果我的域名不想用了,可以更換域名授權嗎?
可以給您更換域名授權,每更換1域名授權僅需10元手續費。
根據關(guān)鍵詞采集回來(lái)的內容是來(lái)自什么網(wǎng)站?
根據關(guān)鍵詞采集是用您設置的關(guān)鍵詞通過(guò)搜索引擎進(jìn)行搜索,采集搜索下來(lái)的結果,來(lái)自不同的網(wǎng)站。 查看全部
織夢(mèng)采集俠是一款站長(cháng)們必備的織夢(mèng)網(wǎng)站后臺手動(dòng)采集軟件,該軟件可以幫助用戶(hù)快速的將網(wǎng)站數據采集和添加,是每一個(gè)織夢(mèng)dede網(wǎng)站必不可少的網(wǎng)站插件工具,能夠進(jìn)行文章的手動(dòng)采集,織夢(mèng)智能采集俠同時(shí)擁有無(wú)限制的域名使用療效,讓你不受次數限制,歡迎有需求的用戶(hù)們前來(lái)下載使用。
織夢(mèng)智能采集俠功能
1、一鍵安裝,全手動(dòng)采集
織夢(mèng)采集俠安裝非常簡(jiǎn)單便捷,只需一分鐘,立即開(kāi)始采集,而且結合簡(jiǎn)單、健壯、靈活、開(kāi)源的dedecms程序,新手也能快速上手,而且我們還有專(zhuān)門(mén)的客服為商業(yè)顧客提供技術(shù)支持。
2、一詞采集,無(wú)須編撰采集規則
和傳統的采集模式不同的是織夢(mèng)采集俠可以依據用戶(hù)設定的關(guān)鍵詞進(jìn)行泛采集,泛采集的優(yōu)勢在于通過(guò)采集該關(guān)鍵詞的不同搜索結果,實(shí)現不對指定的一個(gè)或幾個(gè)被采集站點(diǎn)進(jìn)行采集,減少采集站點(diǎn)被搜索引擎判斷為鏡像站點(diǎn)被搜索引擎懲罰的危險。
3、RSS采集,輸入RSS地址即可采集內容
只要被采集的網(wǎng)站提供RSS訂閱地址,即可通過(guò)RSS進(jìn)行采集,只須要輸入RSS地址即可便捷的 采集到目標網(wǎng)站內容,無(wú)需編撰采集規則,方便簡(jiǎn)單。
4、定向采集,精確采集標題、正文、作者、來(lái)源
定向采集只須要提供列表URL和文章URL即可智能采集指定網(wǎng)站或欄目?jì)热?,方便?jiǎn)單,編寫(xiě)簡(jiǎn)單規則便可精確采集標題、正文、作者、來(lái)源。
5、 多種偽原創(chuàng )及優(yōu)化方法,提高收錄率及排行
自動(dòng)標題、段落重排、高級混淆、自動(dòng)內鏈、內容過(guò)濾、網(wǎng)址過(guò)濾、同義詞替換、插入seo成語(yǔ)、關(guān)鍵詞添加鏈接等多種方式手段對采集回來(lái)的文章加工處理,增強采集文章原創(chuàng )性,利于搜索引擎優(yōu)化,提高搜索引擎收錄、網(wǎng)站權重及關(guān)鍵詞排行。
6、插件全手動(dòng)采集,無(wú)需人工干預
織夢(mèng)采集俠根據預先設定是采集任務(wù),根據所設定的采集方式采集網(wǎng)址,然后手動(dòng)抓取網(wǎng)頁(yè)內容,程序通過(guò)精確估算剖析網(wǎng)頁(yè),丟棄掉不是文章內容頁(yè)的網(wǎng)址,提取出優(yōu)秀文章內容,最后進(jìn)行偽原創(chuàng ),導入,生成,這一切操作程序都是全手動(dòng)完成,無(wú)需人工干預。
7、手工發(fā)布文章亦可偽原創(chuàng )和搜索優(yōu)化處理
織夢(mèng)采集俠并不僅僅是一款采集插件,更是一款織夢(mèng)必備偽原創(chuàng )及搜索優(yōu)化插件,手工發(fā)布的文章可以經(jīng)過(guò)織夢(mèng)采集俠的偽原創(chuàng )和搜索優(yōu)化處理,可以對文章進(jìn)行同義詞替換,自動(dòng)內鏈,隨機插入關(guān)鍵詞鏈接和文章內收錄關(guān)鍵詞將手動(dòng)添加指定鏈接等功能,是一款織夢(mèng)必備插件。
8、定時(shí)定量進(jìn)行采集偽原創(chuàng )SEO更新
插件有兩個(gè)觸發(fā)采集方式,一種是在頁(yè)面內添加代碼由用戶(hù)訪(fǎng)問(wèn)觸發(fā)采集更新,另外種我們?yōu)樯虡I(yè)用戶(hù)提供的遠程觸發(fā)采集服務(wù),新站無(wú)有人訪(fǎng)問(wèn)即可定時(shí)定量采集更新,無(wú)需人工干預。
9、定時(shí)定量更新待初審文稿
縱使你數據庫上面有成千上萬(wàn)篇文章,織夢(mèng)采集俠亦可按照您的須要每晚在您設置的時(shí)間段內定時(shí)定量初審更新。
10、綁定織夢(mèng)采集節點(diǎn),定時(shí)采集偽原創(chuàng )SEO更新
綁定織夢(mèng)采集節點(diǎn)的功能,讓織夢(mèng)CMS自帶的采集功能也能定時(shí)手動(dòng)采集更新。方便早已設置了采集規則的用戶(hù)定時(shí)采集更新。
織夢(mèng)智能采集俠破解說(shuō)明
織夢(mèng)采集俠采集版分UTF8和GBK兩個(gè)版本,根據自己使用的dedecms版本來(lái)選擇!
因文件是用mac系統打包的,會(huì )自帶_MACOSX、.DS_Store文件,不影響使用,有強迫癥的可以刪掉。覆蓋破解文件的時(shí)侯不用管這種文件。
1,【您自行去采集俠官方下載最新v2.8版本(網(wǎng)址: 如果官網(wǎng)不能打開(kāi)就用我備份好的,解壓后有個(gè)采集俠官方插件文件夾,自行選擇安裝對應的版本),然后安裝到您的織夢(mèng)后臺,如果之前安裝過(guò)2.7版本,請先刪掉!】
2,注意安裝的時(shí)侯版本千萬(wàn)不要選錯了,UTF8就裝UTF8,GBK就用GBK的不要混用!
3,【覆蓋破解文件】(共三個(gè)文件CaiJiXia、include和Plugins)
Plugins : 直接覆蓋到網(wǎng)站的根目錄
include : 直接覆蓋到網(wǎng)站的根目錄
CaiJiXia: 網(wǎng)站默認后臺是dede,如果你沒(méi)有更改后臺目錄的話(huà)那就是覆蓋 /dede/apps/下面,如果后臺訪(fǎng)問(wèn)路徑被更改過(guò)的話(huà),那就把dede換成你更改的名稱(chēng)。例:dede已更改成test, 那就覆蓋/test/apps/目錄下
4,【破解程序使用對域名無(wú)限制】
5, 【覆蓋后須要清除下瀏覽器緩存, 推薦使用微軟或則火狐瀏覽器,不要用IE內核瀏覽器,清理緩存有時(shí)清的不干凈】
6, PHP版本必須5.3+
織夢(mèng)智能采集俠使用方式
1、設置定向采集
1)、登錄您網(wǎng)站后臺,模塊->采集俠->采集任務(wù),如果您的網(wǎng)站還沒(méi)有添加欄目,你須要先到織夢(mèng)的欄目管理里先添加欄目,如果早已添加了欄目,你可能可以看見(jiàn)如下界面
2)、在彈出的頁(yè)面里選擇定向采集,如圖所示
3)、點(diǎn)擊添加采集規則
2、設置 目標頁(yè)面編碼
打開(kāi)您要采集的網(wǎng)頁(yè),點(diǎn)擊滑鼠右鍵,點(diǎn)擊查看網(wǎng)站源碼,搜索charset,查看charset前面緊隨的是utf-8還是gb2312
3、設置 列表網(wǎng)址
列表網(wǎng)址就是您要采集的網(wǎng)站的欄目列表地址
如果只是單純采集列表頁(yè)的第一頁(yè),直接輸入該列表URL就行,如我要采集站長(cháng)之家的優(yōu)化欄目的第一頁(yè),那列表URL就輸入:,即可。采集第一頁(yè)的內容的益處就是可以不用采集老舊的新聞,而且有新更新也可以及時(shí)采集到,如果須要采集該欄目的所有內容,那也可以通過(guò)設置鍵值的方法,匹配所有列表URL規則。
織夢(mèng)智能采集俠常見(jiàn)問(wèn)題
綁定x個(gè)域名授權是哪些意思呢?
多少個(gè)域名授權,就是多少個(gè)網(wǎng)站可以使用織夢(mèng)采集俠商業(yè)版。
插件可以指定網(wǎng)站進(jìn)行采集嗎?
插件不僅可以按照關(guān)鍵詞采集外,還有RSS和頁(yè)面監控采集這兩種采集方式,可以指定網(wǎng)站進(jìn)行采集。
如果我的域名不想用了,可以更換域名授權嗎?
可以給您更換域名授權,每更換1域名授權僅需10元手續費。
根據關(guān)鍵詞采集回來(lái)的內容是來(lái)自什么網(wǎng)站?
根據關(guān)鍵詞采集是用您設置的關(guān)鍵詞通過(guò)搜索引擎進(jìn)行搜索,采集搜索下來(lái)的結果,來(lái)自不同的網(wǎng)站。
Python3+Selenium2完整的自動(dòng)化測試實(shí)現之旅(六):Python單
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 221 次瀏覽 ? 2020-08-09 23:04
Unitest是Python下的一個(gè)單元測試模塊,是Python標準庫模塊之一,安裝完P(guān)ython后就可以直接import該模塊,能在單元測試下編撰具體的測試用例腳本,并調用模塊封裝好的方式,實(shí)現測試用例的執行、測試場(chǎng)景的恢復,甚至能批量采集測試用例腳本、批量運行測試腳本用例、控制執行次序等,依托于Unittest模塊,可以高效的組織測試用例編撰、測試用例腳本的采集管理以及腳本運行的執行控制等。Unitest單元測試框架主要收錄如下幾個(gè)重要的邏輯單元:
1.測試固件(test fixture)
一個(gè)測試固件包括兩部份,執行測試代碼的后置條件和測試結束以后的場(chǎng)景恢復,這兩部份通常用函數setUp()和tearDown()表示。簡(jiǎn)單說(shuō),就是平常手工測試一條具體的測試用例時(shí),測試的后置環(huán)境和測試結束后的環(huán)境恢復。
2.測試用例(test case)
unittest中管理的最小單元是測試用例,就是一個(gè)測試用例,包括具體測試業(yè)務(wù)的函數或則方式,只是該test case 必須是以test開(kāi)頭的函數。unittest會(huì )自動(dòng)化辨識test開(kāi)頭的函數是測試代碼,如果你寫(xiě)的函數不是test開(kāi)頭,unittest是不會(huì )執行這個(gè)函數上面的腳本,這個(gè)千萬(wàn)要記住,所有的測試函數都要test開(kāi)頭,記住是大寫(xiě)的哦。
3.測試套件 (test suite)
就是好多測試用例的集合,一個(gè)測試套件可以隨便管理多個(gè)測試用例,該部份拿來(lái)實(shí)現眾多測試用例的采集,形成一套測試用例集。
4.測試執行器 (test runner)
test runner是一個(gè)拿來(lái)執行加載測試用例,并執行用例,且提供測試輸出的一個(gè)邏輯單元。test runner可以加載test case或則test suite進(jìn)行執行測試任務(wù),并能控制用例集的執行次序等。
從Unitest單元測試框架的基本邏輯單元設計來(lái)看,很明顯可以看見(jiàn)它收錄了用例的整個(gè)生命周期:用例的后置條件、用例的編撰、用例的采集、用例的執行以及測試執行后的場(chǎng)景恢復。
二、首次使用Unittest模塊
下面以打開(kāi)百度,進(jìn)行搜索,創(chuàng )建一個(gè)名為baidu_search.py的腳本文件,編寫(xiě)百度搜索分別python2和python3的測試用例,代碼如下:
'''
Code description:
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
import time
import unittest
from selenium import webdriver
class Search(unittest.TestCase):
def setUp(self):
"""
測試前置條件,這里要搜索的話(huà)就是先得打開(kāi)百度網(wǎng)站啦
"""
self.driver = webdriver.Ie()
self.driver.maximize_window()
self.driver.implicitly_wait(5)
self.driver.get("https://www.baidu.com")
def tearDown():
"""
測試結束后環(huán)境復原,這里就是瀏覽器關(guān)閉退出
"""
self.driver.quit()
def test_search1(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python2')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python2' in self.driver.title
print('檢索python2完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search2(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python3')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python3' in self.driver.title
print('檢索python3完成')
except Exception as e:
print('檢索失敗', format(e))
if __name__ == '__main__':
unittest.main()
在PyCharm中運行里面代碼,我們會(huì )發(fā)覺(jué)瀏覽器打開(kāi)關(guān)掉了兩次,分別檢索了python2關(guān)掉瀏覽器,然后檢索python3關(guān)掉瀏覽器。
這個(gè)療效其實(shí)不是我們希望的,我們希望檢索完python2后,不用關(guān)掉瀏覽器繼續檢索python3,Unittest有相關(guān)的設置嗎?答案是肯定的,我們對以上代碼做下調整更改,注意對比不同的地方,然后運行就達到我們想要的療效
'''
Code description:
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
import time
import unittest
from selenium import webdriver
class Search(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""
測試前置條件,這里要搜索的話(huà)就是先得打開(kāi)百度網(wǎng)站啦
"""
cls.driver = webdriver.Ie()
cls.driver.maximize_window()
cls.driver.implicitly_wait(5)
cls.driver.get("https://www.baidu.com")
@classmethod
def tearDownClass(cls):
"""
測試結束后環(huán)境復原,這里就是瀏覽器關(guān)閉退出
"""
cls.driver.quit()
def test_search1(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python2')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python2' in self.driver.title
print('檢索python2完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search2(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').clear() # 清空之前輸入的python2
self.driver.find_element_by_id('kw').send_keys('python3')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python3' in self.driver.title
print('檢索python3完成')
except Exception as e:
print('檢索失敗', format(e))
if __name__ == '__main__':
unittest.main()
三、Unittest模塊批量加載和管理用例
以上對于Unittest框架,我們似乎只用到了測試固件、測試用例兩個(gè)邏輯單元的使用,接下來(lái)問(wèn)題又來(lái)了:我們日常項目中的測試案例肯定不止一個(gè),當案例越來(lái)越多時(shí)我們怎樣管理那些批量案例?如何保證案例不重復?如果案例特別多(成百上千,甚至更多)時(shí)怎么保證案例執行的效率?
來(lái)看一下在unittest框架中怎樣管理批量用例:
手動(dòng)添加采集指定的測試用例集用法:先在PyCharm中新建如下項目層級:
其中baidu_search1還是里面調整更改過(guò)的代碼,然后編輯run_case.py文件,代碼如下:
'''
Code description: 執行add 的測試用例集
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
from testcase.sreach.baidu_sreach1 import Search # 將baidu_sreach.py模塊導入進(jìn)來(lái)
import unittest
suite = unittest.TestSuite() # 構造測試用例集
# suite.addTest(Search("test_search1"))
suite.addTest(Search("test_search2")) # 分別添加baidu_sreach1.py中的兩個(gè)檢索的測試用例
if __name__ == '__main__':
runner = unittest.TextTestRunner() # 實(shí)例化runner
runner.run(suite) #執行測試
這樣運行run_case.py,就只執行了在百度中搜索python3這條用例,手動(dòng)添加指定用例到測試套件的方式是addTest(),但是好多時(shí)侯我們寫(xiě)了好多測試腳本文件,每個(gè)腳本中有多個(gè)test,,如果還是使用addTest()方法就不行了,我們希望能獲取所有的測試集,并全部執行。然后編輯run_all_case.py文件,編寫(xiě)如下代碼:
'''
Code description: TestLoader所有測試case
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
import time
import os.path
import unittest
from selenium import webdriver
class Search(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""
測試前置條件,這里要搜索的話(huà)就是先得打開(kāi)百度網(wǎng)站啦
"""
cls.driver = webdriver.Ie()
cls.driver.maximize_window()
cls.driver.implicitly_wait(5)
cls.driver.get("https://www.baidu.com")
@classmethod
def tearDownClass(cls):
"""
測試結束后環(huán)境復原,這里就是瀏覽器關(guān)閉退出
"""
cls.driver.quit()
def test_search1(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python2')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python2' in self.driver.title
print('檢索python2完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search2(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').clear() # 清空之前輸入的python2
self.driver.find_element_by_id('kw').send_keys('python3')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python3' in self.driver.title
print('檢索python3完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search3(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').clear() # 清空之前輸入的python3
self.driver.find_element_by_id('kw').send_keys('hello world')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'hello world' in self.driver.title
print('檢索hello world完成')
except Exception as e:
print('檢索失敗', format(e))
case_path = os.path.join(os.getcwd()) # 在當前目錄中采集測試用例
print(case_path)
all_case = unittest.defaultTestLoader.discover(case_path, pattern="test*.py", top_level_dir=None) # 采集所有test開(kāi)頭的測試用例
print(all_case)
if __name__ == '__main__':
runner = unittest.TextTestRunner() # 實(shí)例化runner
runner.run(all_case) # 執行測試
獲取所有的測試用例集使用的是discover()方法,在PyCharm中運行該腳本就如下:
以上就完成了在Python Unittest單元測試框架下編撰測試用例腳本,并使用其提供的多種方式來(lái)批量管理測試用例集并并執行。
轉載于: 查看全部
一、Unittest單元測試框架簡(jiǎn)介
Unitest是Python下的一個(gè)單元測試模塊,是Python標準庫模塊之一,安裝完P(guān)ython后就可以直接import該模塊,能在單元測試下編撰具體的測試用例腳本,并調用模塊封裝好的方式,實(shí)現測試用例的執行、測試場(chǎng)景的恢復,甚至能批量采集測試用例腳本、批量運行測試腳本用例、控制執行次序等,依托于Unittest模塊,可以高效的組織測試用例編撰、測試用例腳本的采集管理以及腳本運行的執行控制等。Unitest單元測試框架主要收錄如下幾個(gè)重要的邏輯單元:
1.測試固件(test fixture)
一個(gè)測試固件包括兩部份,執行測試代碼的后置條件和測試結束以后的場(chǎng)景恢復,這兩部份通常用函數setUp()和tearDown()表示。簡(jiǎn)單說(shuō),就是平常手工測試一條具體的測試用例時(shí),測試的后置環(huán)境和測試結束后的環(huán)境恢復。
2.測試用例(test case)
unittest中管理的最小單元是測試用例,就是一個(gè)測試用例,包括具體測試業(yè)務(wù)的函數或則方式,只是該test case 必須是以test開(kāi)頭的函數。unittest會(huì )自動(dòng)化辨識test開(kāi)頭的函數是測試代碼,如果你寫(xiě)的函數不是test開(kāi)頭,unittest是不會(huì )執行這個(gè)函數上面的腳本,這個(gè)千萬(wàn)要記住,所有的測試函數都要test開(kāi)頭,記住是大寫(xiě)的哦。
3.測試套件 (test suite)
就是好多測試用例的集合,一個(gè)測試套件可以隨便管理多個(gè)測試用例,該部份拿來(lái)實(shí)現眾多測試用例的采集,形成一套測試用例集。
4.測試執行器 (test runner)
test runner是一個(gè)拿來(lái)執行加載測試用例,并執行用例,且提供測試輸出的一個(gè)邏輯單元。test runner可以加載test case或則test suite進(jìn)行執行測試任務(wù),并能控制用例集的執行次序等。
從Unitest單元測試框架的基本邏輯單元設計來(lái)看,很明顯可以看見(jiàn)它收錄了用例的整個(gè)生命周期:用例的后置條件、用例的編撰、用例的采集、用例的執行以及測試執行后的場(chǎng)景恢復。
二、首次使用Unittest模塊
下面以打開(kāi)百度,進(jìn)行搜索,創(chuàng )建一個(gè)名為baidu_search.py的腳本文件,編寫(xiě)百度搜索分別python2和python3的測試用例,代碼如下:
'''
Code description:
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
import time
import unittest
from selenium import webdriver
class Search(unittest.TestCase):
def setUp(self):
"""
測試前置條件,這里要搜索的話(huà)就是先得打開(kāi)百度網(wǎng)站啦
"""
self.driver = webdriver.Ie()
self.driver.maximize_window()
self.driver.implicitly_wait(5)
self.driver.get("https://www.baidu.com")
def tearDown():
"""
測試結束后環(huán)境復原,這里就是瀏覽器關(guān)閉退出
"""
self.driver.quit()
def test_search1(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python2')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python2' in self.driver.title
print('檢索python2完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search2(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python3')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python3' in self.driver.title
print('檢索python3完成')
except Exception as e:
print('檢索失敗', format(e))
if __name__ == '__main__':
unittest.main()
在PyCharm中運行里面代碼,我們會(huì )發(fā)覺(jué)瀏覽器打開(kāi)關(guān)掉了兩次,分別檢索了python2關(guān)掉瀏覽器,然后檢索python3關(guān)掉瀏覽器。
這個(gè)療效其實(shí)不是我們希望的,我們希望檢索完python2后,不用關(guān)掉瀏覽器繼續檢索python3,Unittest有相關(guān)的設置嗎?答案是肯定的,我們對以上代碼做下調整更改,注意對比不同的地方,然后運行就達到我們想要的療效
'''
Code description:
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
import time
import unittest
from selenium import webdriver
class Search(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""
測試前置條件,這里要搜索的話(huà)就是先得打開(kāi)百度網(wǎng)站啦
"""
cls.driver = webdriver.Ie()
cls.driver.maximize_window()
cls.driver.implicitly_wait(5)
cls.driver.get("https://www.baidu.com")
@classmethod
def tearDownClass(cls):
"""
測試結束后環(huán)境復原,這里就是瀏覽器關(guān)閉退出
"""
cls.driver.quit()
def test_search1(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python2')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python2' in self.driver.title
print('檢索python2完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search2(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').clear() # 清空之前輸入的python2
self.driver.find_element_by_id('kw').send_keys('python3')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python3' in self.driver.title
print('檢索python3完成')
except Exception as e:
print('檢索失敗', format(e))
if __name__ == '__main__':
unittest.main()
三、Unittest模塊批量加載和管理用例
以上對于Unittest框架,我們似乎只用到了測試固件、測試用例兩個(gè)邏輯單元的使用,接下來(lái)問(wèn)題又來(lái)了:我們日常項目中的測試案例肯定不止一個(gè),當案例越來(lái)越多時(shí)我們怎樣管理那些批量案例?如何保證案例不重復?如果案例特別多(成百上千,甚至更多)時(shí)怎么保證案例執行的效率?
來(lái)看一下在unittest框架中怎樣管理批量用例:

手動(dòng)添加采集指定的測試用例集用法:先在PyCharm中新建如下項目層級:

其中baidu_search1還是里面調整更改過(guò)的代碼,然后編輯run_case.py文件,代碼如下:
'''
Code description: 執行add 的測試用例集
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
from testcase.sreach.baidu_sreach1 import Search # 將baidu_sreach.py模塊導入進(jìn)來(lái)
import unittest
suite = unittest.TestSuite() # 構造測試用例集
# suite.addTest(Search("test_search1"))
suite.addTest(Search("test_search2")) # 分別添加baidu_sreach1.py中的兩個(gè)檢索的測試用例
if __name__ == '__main__':
runner = unittest.TextTestRunner() # 實(shí)例化runner
runner.run(suite) #執行測試
這樣運行run_case.py,就只執行了在百度中搜索python3這條用例,手動(dòng)添加指定用例到測試套件的方式是addTest(),但是好多時(shí)侯我們寫(xiě)了好多測試腳本文件,每個(gè)腳本中有多個(gè)test,,如果還是使用addTest()方法就不行了,我們希望能獲取所有的測試集,并全部執行。然后編輯run_all_case.py文件,編寫(xiě)如下代碼:
'''
Code description: TestLoader所有測試case
Create time:
Developer:
'''
# -*- coding: utf-8 -*-
import time
import os.path
import unittest
from selenium import webdriver
class Search(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""
測試前置條件,這里要搜索的話(huà)就是先得打開(kāi)百度網(wǎng)站啦
"""
cls.driver = webdriver.Ie()
cls.driver.maximize_window()
cls.driver.implicitly_wait(5)
cls.driver.get("https://www.baidu.com")
@classmethod
def tearDownClass(cls):
"""
測試結束后環(huán)境復原,這里就是瀏覽器關(guān)閉退出
"""
cls.driver.quit()
def test_search1(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').send_keys('python2')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python2' in self.driver.title
print('檢索python2完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search2(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').clear() # 清空之前輸入的python2
self.driver.find_element_by_id('kw').send_keys('python3')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'python3' in self.driver.title
print('檢索python3完成')
except Exception as e:
print('檢索失敗', format(e))
def test_search3(self):
"""
這里一定要test開(kāi)頭,把測試邏輯代碼封裝到一個(gè)test開(kāi)頭的方法里。
"""
self.driver.find_element_by_id('kw').clear() # 清空之前輸入的python3
self.driver.find_element_by_id('kw').send_keys('hello world')
self.driver.find_element_by_id('su').click()
time.sleep(1)
try:
assert 'hello world' in self.driver.title
print('檢索hello world完成')
except Exception as e:
print('檢索失敗', format(e))
case_path = os.path.join(os.getcwd()) # 在當前目錄中采集測試用例
print(case_path)
all_case = unittest.defaultTestLoader.discover(case_path, pattern="test*.py", top_level_dir=None) # 采集所有test開(kāi)頭的測試用例
print(all_case)
if __name__ == '__main__':
runner = unittest.TextTestRunner() # 實(shí)例化runner
runner.run(all_case) # 執行測試
獲取所有的測試用例集使用的是discover()方法,在PyCharm中運行該腳本就如下:

以上就完成了在Python Unittest單元測試框架下編撰測試用例腳本,并使用其提供的多種方式來(lái)批量管理測試用例集并并執行。
轉載于:


