一,環境的搭建以及簡單的工具介紹
1.selenium,一個用于Web應用程序測試的工具。其特點是直接運行在瀏覽器中,就像真正的用戶在操作一樣。新版本selenium2集成了 Selenium 1.0 以及 WebDriver;
2.webDriver作用如下:執行代碼通過給Webdriver發送指令,讓Webdriver知道想要做的操作,Webdriver再根據這些操作在瀏覽器界面上進行控制,例如查找頁面元素、發送文本、實現事件點擊等等;
3.pyquery作用如下:此處用到的pyquery主要是一個對html代碼數據進行提取的庫,可以用來替代beautifulsoup和正則表達式對h5的提取。
如何導入所需要的庫:
大部分教程中對于庫的導入都是使用的pip install指令,但是當安裝了多個python版本或者自己不知道自己python路徑的時候,在python中可能無法調用下載的python庫,此處直接使用pycharm進行 導入,示例如下:
點擊file->setting
點擊python interpreter右上角的加號,
在界面中搜索想要的庫,點擊intsall package,便可以導入了。
二.使用selenium模擬瀏覽器訪問京東頁面。
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from pyquery import PyQuery as pq
browser=webdriver.Chrome(ChromeDriverManager().install()) #打開Chrome 瀏覽器
wait=WebDriverWait(browser,10)
try:
browser.get('https://www.jd.com')
input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#key"))) #對輸入框進行指定
sbmit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#search > div > div.form > button'))) #使用submit表示按鈕
input.send_keys('內容') #輸入內容
sbmit.click() #點擊按鈕
total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_bottomPage > span.p-skip > em:nth-child(1) > b')))
get_product()
return total.text
except TimeoutException:
search()說明
上方實現功能為打開京東并在搜索框中輸入內容框所指示的部分然后進行搜索,如果代碼有報錯無法打開chrome,是因為沒有使用webdriver_manager庫,添加該庫,其作用是自動聯網下載chromedriver是的webdriver.chrome可以運行。
三. 模擬連續翻頁,方便進行搜索
函數代碼如下:
def next_page(page_number):
try:
input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_bottomPage > span.p-skip > input')))
submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_bottomPage > span.p-skip > a')))
input.clear()
input.send_keys(page_number)
submit.click()
wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#J_bottomPage > span.p-num > a.curr'),str(page_number)))
get_product()
except TimeoutException:
next_page(page_number)
函數的功能為模擬在輸入框中輸入頁碼page_number,然后使用sunbmit.click語句嗎,模擬點擊翻頁。
四.對數據進行抓取,并進行解析。
函數代碼如下:
def get_product():
# wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_goodsList .gl-warp .gl-item'))) #檢測圖片是否加載完成
html=browser.page_source #獲取網頁源代碼
doc=pq(html)
items=doc('#J_goodsList .gl-warp .gl-item').items() #獲取所有的選擇內容
for item in items:
product={
'image': item.find('.p-img img').attr('src'), #通過獲取src屬性來獲取圖片
'price': item.find('.p-price').text(), #獲取文字內容
'name': item.find('.p-name').text(), #獲取物品標題
'shop': item.find('.p-shop').text() #獲取商鋪信息
}
print(product)
此處使用到的庫為pyquery,通過selenium庫對網頁源代碼進行獲取,然后通過pyquery的find語句查找相應的元素裝載到product中,最后進行打印。
最后,小編想說:我是一名python開發工程師,整理了一套最新的python系統學習教程,想要這些資料的可以關注私信小編“01”即可(免費分享哦)希望能對你有所幫助。
JavaScript中,您可以使用HTML5的<input type="file">元素來實現圖片上傳功能。
以下是一個簡單的示例代碼,演示如何在JavaScript中上傳圖片:
HTML部分:
<input type="file" id="uploadInput">
<button onclick="uploadImage()">上傳圖片</button>
JavaScript部分:
function uploadImage() {
var fileInput=document.getElementById('uploadInput');
var file=fileInput.files[0];
if (file) {
var formData=new FormData();
formData.append('image', file);
// 發送圖片數據到服務器
// 這里可以使用XMLHttpRequest或fetch等方法發送請求
// 請根據您的需求選擇適當的方法
// 示例中使用XMLHttpRequest發送POST請求
var xhr=new XMLHttpRequest();
xhr.open('POST', '/upload', true);
xhr.onload=function() {
if (xhr.status===200) {
// 上傳成功
console.log('圖片上傳成功');
} else {
// 上傳失敗
console.log('圖片上傳失敗');
}
};
xhr.send(formData);
}
}
API部分:
[HttpPost]
[RequestSizeLimit(5242880)]
public async Task<APIResult> upload(IFormCollection collection)
{
APIResult rtn=new APIResult();
if (collection==null)
{
rtn.code=-100;
rtn.msg="圖片列表為空";
return rtn;
}
else
{
try
{
string file_path="";
// 預處理 用戶參數:用戶指定子路徑
string userPath=DateTime.Now.ToString("yyyy-MM-dd");
if (collection.ContainsKey("path"))
{
collection.TryGetValue("path", out Microsoft.Extensions.Primitives.StringValues val);
if (!val.Equals("undefined"))
{
userPath=val.ToString();
}
}
// 預處理 文件路徑
// 注意:這里可能會根據不同的環境來 修改 路徑前面是否需要添加 /
// 當發現上傳不成功,目錄無法創建時,可以嘗試修改這里
file_path=$"upload/imgs/{userPath}/";
var uploadPath=Path.Combine(_webHostEnvironment.WebRootPath, file_path);
if (!Directory.Exists(uploadPath))
{
Directory.CreateDirectory(uploadPath);
}
// 處理文件
FormFileCollection filelist=(FormFileCollection)collection.Files;
foreach (IFormFile file in filelist)
{
// 保存文件到磁盤
string name=file.FileName;
string FilePath=Path.Combine(uploadPath, name);
string type=Path.GetExtension(name);
using (var stream=System.IO.File.Create(FilePath))
{
await file.CopyToAsync(stream);
};
// 保存文件信息到表
Sys_File f=new Sys_File();
f.code="image";
f.name=name;
f.file_type=type.Trim('.');
f.file_group=userPath;
f.file_path=$"/{file_path}{name}";
f.is_active=true;
f.memo="";
f.createTime=DateTime.Now;
using (var dbctx=DBHelper.db)
{
await dbctx.AddAsync(f);
await dbctx.SaveChangesAsync();
};
// 返回消息,包含文件路徑
rtn.datas=$"/{file_path}{name}";
rtn.code=100;
rtn.msg="文件已保存!";
}
}
catch (Exception ex)
{
rtn.code=-200;
rtn.msg="圖片保存失敗!";
Log4NetUnit.Instance.Log.Error("圖片保存失敗:" + ex.Message);
}
return rtn;
}
}
在這個示例中,我們首先在HTML中創建了一個<input type="file">元素,用于選擇要上傳的圖片。
然后,我們在JavaScript中編寫了一個uploadImage函數,該函數在點擊"上傳圖片"按鈕時觸發。
在uploadImage函數中,我們首先獲取到<input>元素,并從中獲取到用戶選擇的圖片文件。
然后,我們創建一個FormData對象,并將圖片文件添加到其中。
接下來,我們可以使用XMLHttpRequest或fetch等方法將圖片數據發送到服務器。
在示例中,我們使用XMLHttpRequest發送了一個POST請求,將圖片數據作為FormData發送到/upload端點。
您需要根據您的實際情況修改URL和請求方法。
當請求完成時,我們可以根據響應的狀態碼來判斷上傳是否成功。
在示例中,如果狀態碼為200,則表示上傳成功,否則表示上傳失敗。
請注意,由于安全性限制,JavaScript無法直接訪問用戶的文件系統。
因此,用戶必須手動選擇要上傳的文件。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。