作者:Yammi大魔王
链接:https://www.zhihu.com/question/570765297/answer/2880002250
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
下文将以一个具体的示例来展示如何更好地提问,在此之前要说明的是:
- 你的提问最好是聚焦在某个具体问题。太开放性的问题事实上本身可能无解,也不具备太现实的意义;
- 如果你要解决的问题,你自身对其已有大致的解决思路(基于现存已知的技术或方案),只是在专业度方面不够,chatGPT的回答会使你收益最大化。如果你本身并不明白问题要如何解决,只是提了个知识型的提问,那么收益会小得多。如果你的提问几乎没什么现实案例,那么你只能把期待降到最低;
- 经我实践验证,chatGPT比较擅长解决的问题有2大类,一类是清晰结构化的问题,例如写代码、如何做一件常规的事,另一类是框架清晰,只需要它填充细节,并且你对细节有明确要求的事务。其实第一类是第二类的子集,总体来说,用好chatGPT的前提是你有框架;
- 我接下来演示一下如何用chatGPT解决一个具体问题。
用一个最常见的问题举例吧,电商类的。没有太大的实际用途,但好在大家都懂这个场景。
我家的电热水壶用了5年,昨天短路了,我需要买个新的,但是我没空自己去比价格,所以我决定写一个Python程序,让它替我自动找各种电热水壶商品然后比价。——现实中我不会这么干的,我直接去小米线下店买一个小米电热水壶2.0。
好,首先你需要设计一个实现的方案。我们俗称执行路径。
在此之前,你得知道一个现状,那就是别太指望用爬虫的方式去抓取电商的数据,基本上电商现在都禁止爬虫了。
所以我们的执行路径依赖于RPA这种思路,也就是创造一个机器人模拟你做这件事儿的动作,这种思路最直观、最好理解、也最容易表达。
所以做这件事的步骤如下——以下步骤我们的原则是不要试图使用最牛逼的技术,而是使用最直观的技术,毕竟,你可能也不太懂技术,那么用牛逼的技术,你可能很难验证是否做对了——另外,我也不懂牛逼的技术(这是关键):
-
打开一个浏览器,并使其打开taobao.com页面;
-
等待你输入账号密码登录——机器人也可以登录,但容易被验证——登陆后,你得给机器人一个信号,让它知道它可以替代你进行接下来的动作了,比如,你可以设定一个键盘输入让它理解这个事儿;
-
让它按照你的要求来查询商品,你需要向它提供一个商品名称;
-
接下来就是机器人的自动循环,它要做的是3件事:
-
搜索商品
-
按照 taobao搜索结果页的html特征捕获具体的商品
-
点进去,存储商品信息
-
最后要设定一个比价逻辑,比如单纯比价格或者按每单位容量的价格衡量,把最佳结果打印出来(或者其他方式显示给你)
![](https://img.haomeiwen.com/i1929748/7f06d5c11574ccfe.jpg)
from selenium import webdriver
# create a new Chrome browser instance
browser = webdriver.Chrome()
# navigate to taobao.com
browser.get('https://www.taobao.com')
![](https://img.haomeiwen.com/i1929748/824f0d5a39af1936.jpg)
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
# create a new Chrome browser instance
browser = webdriver.Chrome()
# navigate to taobao.com
browser.get('https://www.taobao.com')
# wait until the login button appears
xpath = "/html/body/div[3]/div[2]/div[2]/div[2]/div[5]/div/div[2]/div[1]/a[1]"
WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))
# the login button has appeared, so we can now access it
login_button = browser.find_element_by_xpath(xpath)
注意,在深入提问的过程,因为需求逐渐细化,chatGPT会不断调整此前的代码,甚至用一种新的模块或书写方法重写。一般来说无关紧要,重要的还是自己能看懂代码逻辑。
![](https://img.haomeiwen.com/i1929748/79a49cecae90e4cf.jpg)
# click the login button to enter the login page
login_button.click()
获取登录输入框的XPath,然后让程序等待这个Xpath出现,说明页面加载完毕。
![](https://img.haomeiwen.com/i1929748/5a86390ea06f0fb7.jpg)
![](https://img.haomeiwen.com/i1929748/7c4a1a33fcbb0f56.jpg)
# wait until the login page appears
xpath = "//*[@id='fm-login-id']"
WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))
# the login page has appeared, so we can now access elements on the page
username_field = browser.find_element_by_xpath(xpath)
实际上因为我们计划手动输入账号密码,所以上述代码中的username_field值并不需要,可以去掉。
![](https://img.haomeiwen.com/i1929748/9d196d444c594798.jpg)
from selenium.webdriver.common.action_chains import ActionChains
import keyboard
def wait_for_hotkey():
keyboard.wait('ctrl+F7')
return
action = ActionChains(browser)
action.key_down(Keys.CONTROL).key_down('F7').key_up('F7').key_up(Keys.CONTROL)
action.perform()
# wait for the hotkey
wait_for_hotkey()
为了格式好看一些,import相关的代码可以放到最上面去。其他的放在上述代码后面也ok。
接下来要开始搜索和查询商品了。
这时候应该已经完成了登录,应该让程序去找到搜索框。
![](https://img.haomeiwen.com/i1929748/7548bd75b7e91d26.jpg)
# wait for the search field to appear
search_field = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.XPATH, "//*[@id='q']"))
)
# enter the search text
search_field.send_keys("电热水壶")
由于代码里用到的库,上面已经引用了,所以这里的代码不需要再包含这些库。
![](https://img.haomeiwen.com/i1929748/f94624d99706ca2e.jpg)
search_button = browser.find_element_by_xpath("//*[@id='J_TSearchForm']/div[1]/button")
search_button.click()
虽然chatGPT像个奶妈一样无微不至地提醒你代码运行可能出现的错误,并给了第二套解决方案,但敬谢了,我们直接用第一段就好。
好了,前面都还比较简单,这里出现重复区域了,我们应该怎么逐个点击对应的商品并获得它们的相应信息呢?
![](https://img.haomeiwen.com/i1929748/0887f694890cf921.jpg)
我假装也不知道,然后我们问问chatGPT吧。
![](https://img.haomeiwen.com/i1929748/7b2cc591bb6a73de.jpg)
这次,chatGPT仿佛是搞懂了你到底想要干什么,于是把整个代码全都重写了一遍(因为前面我们没有要求它处理登录的部分,所以它并不知道这部分的内容,因此没有登陆相关的动作)。
所以我们有选择地筛选一下代码内容。
# wait for the search results to load
search_results = WebDriverWait(browser, 10).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".J_ItemPic.img"))
)
# loop through each featured image
for img in search_results:
img.click()
# wait for the item page to load and do something with the page
item_page = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.ID, "J_DetailMeta"))
)
# do something with the item page
# ...
browser.back()
然后我们要开始获得商品的标题、SKU参数(一般就是颜色款式之类的内容)
![](https://img.haomeiwen.com/i1929748/bf603cf1f77fbe17.jpg)
这部分代码其实应该是前面那段循环代码中的一部分,因此要放到前面那段里,我们重组一下
# wait for the search results to load
search_results = WebDriverWait(browser, 10).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".J_ItemPic.img"))
)
# loop through each featured image
for img in search_results:
img.click()
# wait for the item page to load and do something with the page
item_page = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.ID, "J_DetailMeta"))
)
# do something with the item page
title_xpath = "//*[@id='root']/div/div[2]/div[2]/div[1]/div/div[2]/div[1]/h1"
price_class = "skuValueName"
price_xpath1 = "//*[@id='root']/div/div[2]/div[2]/div[1]/div/div[2]/div[2]/div/div[2]/div/div/div[1]/span[3]"
price_xpath2 = "//*[@id='root']/div/div[2]/div[2]/div[1]/div/div[2]/div[2]/div/div[2]/div/div/div[2]/span[3]"
title_element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, title_xpath)))
price_elements = driver.find_elements_by_class_name(price_class)
for price_element in price_elements:
try:
span_text = price_element.text
price1_element = driver.find_element_by_xpath(price_xpath1)
price1 = int(price1_element.text)
price2_element = driver.find_element_by_xpath(price_xpath2)
price2 = int(price2_element.text)
price = min(price1, price2)
print("Title:", title_element.text, "Price:", price, "Span Text:", span_text)
except:
print("Failed to find the prices for Span Text:", span_text)
browser.back()
到此为止,整个商品查价格的动作就完成了(其实漏了一步,没有把标题、款式、价格和链接这些信息保存下来,不过作为示例这些就不重要了)。
通过上述的过程,可以看出chatGPT的强大,以及应该如何从chatGPT挖掘最佳的答案。
chatGPT并不是绝对的神器,不要认为强AI的时代已经来了,远远没有!现在的chatGPT还远远无法做到“言出法随”,它只是人类过去所积累的知识、通过互联网这种载体、存储下来的那部分的精华和集大成者。
但是人+AI协作,即将大幅提高某些领域的生产效率,这一点是毋庸置疑的。
早点学会如何使用这种强大的人机协作工具,就早点掌握下一代技术致富的密码。否则,就像我所担忧的那样:
网友评论