整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

正则神级应用-替换HTML资源引用

何用正则替换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. 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()

完整代码