何用正则替换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小时内与您取得联系。