整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JavaScript正則獲取字符串括號內的內容

          JavaScript正則獲取字符串括號內的內容

          先,介紹一下正則的概念。正則表達式是由一個字符序列形成的搜索模式。當你在文本中搜索數據時,你可以用搜索模式來描述你要查詢的內容。正則表達式可用于所有文本搜索和文本替換的操作。其基本語法結構如下:

          /正則表達式主體/修飾符(可選)

          其中,修飾符部分是可選內容。常見的修飾符有:

          修飾符描述i執行對大小寫不敏感的匹配。g執行全局匹配(查找所有匹配而非在找到第一個匹配后停止)。m執行多行匹配。

          另外,JS的正則表達式模式和Python相似,具體可以參考資料2所示。主要包括:方括號、元字符和量詞等。

          支持正則表達式的String對象的方法如下:

          方法描述FFIEsearch檢索與正則表達式相匹配的值。14match找到一個或多個正則表達式的匹配。14replace替換與正則表達式匹配的子串。14split把字符串分割為字符串數組。14

          其中,match會返回匹配上的內容,比較常用。

          以下給出一個利用JavaScript正則獲取字符串括號內的內容的小例子:

          encode='aa(ddsdd)gh'var re=/\([^\)]+\)/gencode=encode.match(re)[0]encode=encode.substring(1,encode.length-1)  //ddsdd

          原文鏈接:https://blog.csdn.net/sinat_23133783/article/details/109082113?utm_medium=distribute.pc_category.none-task-blog-hot-3.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-3.nonecase&request_id=

          作者:麥片加奶不加糖

          ttpRunner獲取響應數據&extract提取值到變量

          獲取響應數據

          extract提取

          注:extract 應與request保持同一層級

          1. 響應行,響應頭;通過 extract 提取響應的數據并存儲到變量中,如下
          注:變量名的前面要有 -
          # 獲取響應數據: 響應行(200,ok)\響應頭
          - config:
              name: 測試百度網站
              base_url: https://www.baidu.com
          
          - test:
              name: 接口名稱 百度接口
              request:
                url: /
                method: GET
              extract:  # 提取值存儲到變量中
                - code: status_code  # 響應碼
                - info: reason       # ok
                - header_Content: headers.Content-Type  # 響應頭部
              validate:
                - eq: [$code,200]  # 引用變量  $變量名
                - eq: [$info,"OK"]
                - eq: [$header_Content,'text/html']
          
          1. 獲取響應正文

          extract 解析響應正文(支持正則)

          通過 extract 提取響應正文的數據并存儲到變量中(可使用正則提取),如下:

          注:如果斷言為中文,加上headers頭部的Accept-Language即可,后面有專門寫的中文亂碼解碼的問題解決
          
          # 獲取響應數據  響應正文(支持正則)
          - config:
              name: 百度
              base_url: https://www.baidu.com
          
          - test:
              name: 百度主頁
              request:
                  url: /
                  method: GET
                  headers:  # 如果斷言為中文的話,加上headers的Accept-Language即可
                    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
                    Accept-Encoding: gzip, deflate, br
                    Accept-Language: zh-CN,zh;q=0.9
                    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36
              extract:
                - title: <title>(.+?)</title>  # 可以使用正則表達式提取
              validate:
                - eq: [$title,"百度一下,你就知道"]
          

          extract 解析響應正文(支持json)

          通過 extract 提取響應正文的數據并存儲到變量中(提取json數據),格式以content為根節點:content.key.key.key ;如下:

          次爬取用到的知識點有:

          1. selenium
          2. pymysql
          3. pyquery

          正文

          1. 分析目標網站
          2. 打開某寶首頁, 輸入"男裝"后點擊"搜索", 則跳轉到"男裝"的搜索界面.
          3. 空白處"右擊"再點擊"檢查"審查網頁元素, 點擊"Network".

          1) 找到對應的URL, URL里的參數正是Query String Parameters的參數, 且請求方式是GET

          2) 我們請求該URL得到內容就是"Response"里的內容, 那么點擊它來確認信息.

          3) 下拉看到"男裝"字樣, 那么再往下找, 并沒有發現有關"男裝"的商品信息.

          4) 任意復制一個商品信息, 空白處右擊再點擊"查看網頁源代碼", 在源碼查找該商品, 即可看到該商品的信息.

          5) 對比網頁源代碼和"Response"響應內容, 發現源代碼<script>..........</script>中的商品信息被替換, 這便是采用了JS加密

          6) 如果去請求上面的URL, 得到的則是加密過的信息, 這時就可以利用Selenium庫來模擬瀏覽器, 進而得到商品信息.

          獲取單個商品界面

          1. 請求網站
          # -*- coding: utf-8 -*-
          from selenium import webdriver #從selenium導入瀏覽器驅動
          browser=webdriver.Chrome() #聲明驅動對象, 即Chrome瀏覽器
          def get_one_page():
           '''獲取單個頁面'''
           browser.get("https://www.xxxxx.com") #請求網站
          
          1. 輸入"男裝", 在輸入之前, 需要判斷輸入框是否存在, 如果存在則輸入"男裝", 不存在則等待顯示成功.
          # -*- 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("男裝") #輸入商品名稱
          
          1. 下一步就是點擊"搜索"按鈕, 按鈕具有屬性: 可點擊, 那么加入判斷條件.
          # -*- 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() 
          
          1. 獲取總的頁數, 同樣加入等待判斷.
          # -*- 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()
          
          1. 打印出來的不是我們想要的結果, 利用正則表達式獲取, 最后再利用try...except捕捉異常
          # -*- 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()
          

          完整代碼


          主站蜘蛛池模板: 一区二区三区在线播放| 91一区二区三区四区五区| 在线观看国产一区二区三区| 99久久精品午夜一区二区| 男女久久久国产一区二区三区| 亚洲AV无码一区二区乱孑伦AS| 亚洲AV综合色区无码一区| 3d动漫精品啪啪一区二区中| 精品少妇人妻AV一区二区| 日本丰满少妇一区二区三区 | 农村人乱弄一区二区| 亚洲电影国产一区| 亚洲AV无码国产一区二区三区| 精品一区二区久久久久久久网精| 国产一区二区三区不卡在线看| 国产精品一区三区| 国产吧一区在线视频| 亚洲Aⅴ无码一区二区二三区软件 亚洲AⅤ视频一区二区三区 | 波多野结衣AV无码久久一区| 久久久国产精品亚洲一区| 国内精品视频一区二区三区八戒| 国产免费伦精品一区二区三区| 蜜臀AV免费一区二区三区| 日本一区二区三区精品国产| 射精专区一区二区朝鲜| 日韩一区二区三区视频久久| 少妇激情av一区二区| 无码人妻精品一区二| 99久久无码一区人妻a黑| 中文字幕一区在线| 日韩精品人妻一区二区三区四区| 久久久久女教师免费一区| 国产怡春院无码一区二区| 国产精品无码AV一区二区三区| 国产麻豆精品一区二区三区| 国99精品无码一区二区三区 | 青青青国产精品一区二区| 国产成人精品日本亚洲专一区| 中文字幕亚洲一区| 色天使亚洲综合一区二区| 日韩精品乱码AV一区二区|