何用正則替換css文件路徑
例如:
<link href="css/main.css" type="text/css" rel="stylesheet">
替換成
<link href="/path1/path2/css/main.css" type="text/css" rel="stylesheet">
請問這樣如何替換呢?
# 下面正則式二選一
(<link[^>]*?href=[""'])(\.{2}\/plugins?)([^""']+)([^>]+>)
(<link[^>]*?href=[""'])(\.{2}\/dist+)([^""']+)([^>]+>)
/path1/path2/
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ ORGANIZATION }} | 登錄</title>
<!-- Google Font: Source Sans Pro -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
<!-- Font Awesome -->
<link rel="stylesheet" href="../plugins/fontawesome-free/css/all.min.css">
<!-- icheck bootstrap -->
<link rel="stylesheet" href="../plugins/icheck-bootstrap/icheck-bootstrap.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="../dist/css/adminlte.min.css">
</head>
敬的讀者們:您好!作為一名資深網絡開發師,在此向您介紹我在項目實踐中所運用到的HTML網頁內容提取神器——這便是一款免費且功能強大的軟件,極大地節省了我寶貴的時間與精力。接下來將為您講解這款神奇的工具在使用過程中的十大要點。期待這些信息能對您有所裨益。
1.網頁解析功能
此款智能工具能深入剖析HTML頁面,精確抽取文本、圖像及鏈接等多種關鍵資源,僅需明晰設定與操作便可迅速獲取所需信息,極大提升使用效率。
2.靈活定制抓取規則
本工具賦予您對網頁結構及特性進行個性化抓取規則設定的權力,無論您所需的是簡易標簽選擇器或是精密的正則表達式,皆能得到滿足。
3.多種輸出格式
此款神器支持多種導出格式,如文本、Excel表單和JSON等,方便您根據實際需求選擇最佳的輸出方案。
4.批量處理功能
此款工具適用于管理多個網頁數據,能夠一次性批量處理,迅速且精確地從海量網頁中萃取所需信息。
5.自動化任務
此應用程式具備自動執行任務之特性,用戶可設定定時任務以自動采集特定網站內頁。對于需求定時更新資訊者,其效用不言而喻。
6.強大的過濾功能
運用此款利器所具備之篩選功能,可將無關或重復信息隔絕在外,保存所需關鍵訊息。如此操作有助于提升數據之準確度及實用性。
7.友好的用戶界面
此工具的用戶界面設計簡潔直觀,便于使用,且無需具備編程知識就能迅速掌握并滿足需求。
8.快速響應和更新
此工具的締造者隊伍十分專業化,反應迅捷,注重滿足用戶反饋及需求,持續升級以及完善其各項功能與特性。
9.豐富的文檔和教程
為確保用戶深入掌握此產品,研發團隊推出詳盡文檔和教程,旨在向廣大用戶及專業開發人員提供援助與指南。
10.免費且開源
在此鄭重聲明,此工具完全提供免費且可公開獲取的源代碼。用戶可以無限制地使用及修改此軟件,并且可以任意傳播。這尤其適合資金有限以及希望訂制工具的人士選用。
以上即為關于HTML網頁內容提取工具使用心得的分享。期待能為您在頁面挖掘方面提供有益參考。若您有任何疑問或建議,請隨時賜教。感謝各位閱讀!
次爬取用到的知識點有:
正文
1) 找到對應的URL, URL里的參數正是Query String Parameters的參數, 且請求方式是GET
2) 我們請求該URL得到內容就是"Response"里的內容, 那么點擊它來確認信息.
3) 下拉看到"男裝"字樣, 那么再往下找, 并沒有發現有關"男裝"的商品信息.
4) 任意復制一個商品信息, 空白處右擊再點擊"查看網頁源代碼", 在源碼查找該商品, 即可看到該商品的信息.
5) 對比網頁源代碼和"Response"響應內容, 發現源代碼<script>..........</script>中的商品信息被替換, 這便是采用了JS加密
6) 如果去請求上面的URL, 得到的則是加密過的信息, 這時就可以利用Selenium庫來模擬瀏覽器, 進而得到商品信息.
獲取單個商品界面
# -*- coding: utf-8 -*- from selenium import webdriver #從selenium導入瀏覽器驅動 browser = webdriver.Chrome() #聲明驅動對象, 即Chrome瀏覽器 def get_one_page(): '''獲取單個頁面''' browser.get("https://www.xxxxx.com") #請求網站
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By #導入元素定位方法模塊 from selenium.webdriver.support.ui import WebDriverWait #導入等待判斷模塊 from selenium.webdriver.support import expected_conditions as EC #導入判斷條件模塊 browser = webdriver.Chrome() def get_one_page(): '''獲取單個頁面''' browser.get("https://www.xxxxx.com") input = WebDriverWait(browser,10).until( #等待判斷 EC.presence_of_element_located((By.CSS_SELECTOR,"#q"))) #若輸入框顯示成功,則獲取,否則等待 input.send_keys("男裝") #輸入商品名稱
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC browser = webdriver.Chrome() def get_one_page(): '''獲取單個頁面''' browser.get("https://www.xxxxx.com") input = WebDriverWait(browser,10).until( EC.presence_of_element_located((By.CSS_SELECTOR,"#q"))) # input.send_keys("男裝") button = WebDriverWait(browser,10).until( #等待判斷 EC.element_to_be_clickable((By.CSS_SELECTOR,"#J_TSearchForm > div.search-button > button"))) #若按鈕可點擊, 則獲取, 否則等待 button.click()
# -*- coding: utf-8 -*- ? import re 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 browser = webdriver.Chrome() def get_one_page(): '''獲取單個頁面''' browser.get("https://www.xxxxx.com") input = WebDriverWait(browser, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))) input.send_keys("男裝") button = WebDriverWait(browser, 10).until( EC.element_to_be_clickable( (By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button"))) button.click() pages = WebDriverWait(browser, 10).until( # 等待判斷 EC.presence_of_element_located( (By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total"))) # 若總頁數加載成功,則獲取總頁數,否則等待 return pages.text def main(): pages = get_one_page() print(pages) if __name__ == '__main__': main()
# -*- coding: utf-8 -*- import re 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 browser = webdriver.Chrome() def get_one_page(): '''獲取單個頁面''' try: browser.get("https://www.xxxxx.com") input = WebDriverWait(browser,10).until( EC.presence_of_element_located((By.CSS_SELECTOR,"#q"))) input.send_keys("男裝") button = WebDriverWait(browser,10).until( EC.element_to_be_clickable((By.CSS_SELECTOR,"#J_TSearchForm > div.search-button > button"))) button.click() pages = WebDriverWait(browser,10).until( EC.presence_of_element_located((By.CSS_SELECTOR,"#mainsrp-pager > div > div > div > div.total"))) return pages.text except TimeoutException: return get_one_page() #如果超時,繼續獲取 def main(): pages = get_one_page() pages = int(re.compile("(\d+)").findall(pages)[0]) #采用正則表達式提取文本中的總頁數 print(pages) if __name__ == '__main__': main() ?
關于Selenium的更多內容,可參看官方文檔https://selenium-python.readthedocs.io/waits.html
獲取多個商品界面
采用獲取"到第 頁"輸入框方式, 切換到下一頁, 同樣是等待判斷
需要注意的是, 最后要加入判斷: 高亮是否是當前頁
def get_next_page(page): try: input = WebDriverWait(browser, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input"))) # 若輸入框加載成功,則獲取,否則等待 input.send_keys(page) # 輸入頁碼 button = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit"))) # 若按鈕可點擊,則獲取,否則等待 button.click() # 點擊按鈕 WebDriverWait(browser,10).until( EC.text_to_be_present_in_element((By.CSS_SELECTOR,"#mainsrp-pager > div > div > div > ul > li.item.active > span"),str(page))) # 判斷高亮是否是當前頁 except TimeoutException: # 超時, 繼續請求 return get_next_page(page) def main(): pages = get_one_page() pages = int(re.compile("(\d+)").findall(pages)[0]) for page in range(1,pages+1): get_next_page(page) if __name__ == '__main__': main()
獲取商品信息
首先, 判斷信息是否加載成功, 緊接著獲取源碼并初始化, 進而解析.
需要注意的是, 在"get_one_page"和"get_next_page"中調用之后, 才可執行
def get_info(): """獲取詳情""" WebDriverWait(browser,20).until(EC.presence_of_element_located(( By.CSS_SELECTOR,"#mainsrp-itemlist .items .item"))) #判斷商品信息是否加載成功 text = browser.page_source #獲取網頁源碼 html = pq(text) #初始化網頁源碼 items = html('#mainsrp-itemlist .items .item').items() #采用items方法會得到生成器 for item in items: #遍歷每個節點對象 data = [] image = item.find(".pic .img").attr("src") #用find方法查找子孫節點,用attr方法獲取屬性名稱 price = item.find(".price").text().strip().replace("\n","") #用text方法獲取文本,strip()去掉前后字符串,默認是空格 deal = item.find(".deal-cnt").text()[:-2] title = item.find(".title").text().strip() shop = item.find(".shop").text().strip() location = item.find(".location").text() data.append([shop, location, title, price, deal, image]) print(data)
保存到MySQL數據庫
def save_to_mysql(data): """存儲到數據庫""" # 創建數據庫連接對象 db= pymysql.connect(host = "localhost",user = "root",password = "password",port = 3306, db = "spiders",charset = "utf8") # 獲取游標 cursor = db.cursor() #創建數據庫 cursor.execute("CREATE TABLE IF NOT EXISTS {0}(shop VARCHAR(20),location VARCHAR(10),title VARCHAR(255),price VARCHAR(20),deal VARCHAR(20), image VARCHAR(255))".format("男裝")) #SQL語句 sql = "INSERT INTO {0} values(%s,%s,%s,%s,%s,%s)".format("男裝") try: #傳入參數sql,data if cursor.execute(sql,data): #插入數據庫 db.commit() print("********已入庫**********") except: print("#########入庫失敗#########") #回滾,相當什么都沒做 db.rollback() #關閉數據庫 db.close()
完整代碼
*請認真填寫需求信息,我們會在24小時內與您取得聯系。