AI寫代碼:我用kimi生成了一個爬蟲去下載了1000+PDF文檔(ai代碼怎么寫)
今天嘗試用kimi去爬取網(wǎng)站,下載文檔。選了一個比較簡單的網(wǎng)站。http://orthomolecular.org/resources/omns/index.sHTML。這里面包含了大量的pdf文獻(xiàn)下載鏈接。有1300多份,看Kimi是否能提供代碼去下載這些文檔
kimi的回答:
我已經(jīng)閱讀了您提供的網(wǎng)址中的HTML代碼內(nèi)容。這個頁面是《Orthomolecular News Service》的新聞發(fā)布索引頁面,列出了不同年份和月份的新聞標(biāo)題。這些新聞主要關(guān)注營養(yǎng)、健康、醫(yī)學(xué)和公共衛(wèi)生話題,特別是關(guān)于維生素和補(bǔ)充劑的使用。
頁面列出了從2024年4月22日到2005年3月23日的新聞發(fā)布,每條新聞都有對應(yīng)的卷號、期號、發(fā)布日期和主題。例如,最新的新聞發(fā)布是關(guān)于紀(jì)念Burt Berkson博士的逝世,而其他的新聞發(fā)布則涵蓋了間歇性禁食、心臟協(xié)會對間歇性禁食研究的不負(fù)責(zé)任的新聞發(fā)布、NAD 和煙酸在長壽和健康中的作用等主題。
此外,頁面還提供了訂閱《Orthomolecular Medicine News Service (OMNS)》的選項,以便通過電子郵件接收最新的新聞發(fā)布。
如果您有關(guān)于這些新聞發(fā)布或該網(wǎng)站的具體問題,請告訴我,我會盡力幫助您
從kimi的回答來看,kimi似乎是學(xué)習(xí)了這個網(wǎng)站的內(nèi)容,我的本意是要讓kimi學(xué)習(xí)這個網(wǎng)站的html結(jié)構(gòu),然后提供代碼下載pdf
kimi的回答:
要下載一個網(wǎng)站上所有PDF文件,您需要使用Python的一些庫,如requests來處理網(wǎng)絡(luò)請求和BeautifulSoup來解析HTML內(nèi)容。以下是一個簡單的Python腳本示例,它嘗試找到所有具有PDF后綴的<a>標(biāo)簽,并下載相應(yīng)的文件。
請注意,這個腳本假定所有的PDF鏈接都是直接鏈接到PDF文件的HTTP URL。如果鏈接是通過JavaScript動態(tài)生成的,或者在點(diǎn)擊時重定向到PDF文件,那么可能需要更復(fù)雜的方法來處理。
此外,由于我不能實際執(zhí)行代碼或確認(rèn)鏈接的有效性,以下代碼可能需要根據(jù)您的具體需求進(jìn)行調(diào)整:
kimi提供了下載的思路,果然和我之前想的一樣,kimi還不能智能到學(xué)習(xí)html的結(jié)構(gòu),然后根據(jù)我的需要去下載想要的東西
kimi提供的代碼如下:
import requestsfrom bs4 import BeautifulSoupimport os# 網(wǎng)址url = "http://orthomolecular.org/resources/omns/index.shtml"# 發(fā)送HTTP請求response = requests.get(url)response.raise_for_status() # 如果請求失敗,將拋出異常# 解析HTML內(nèi)容soup = BeautifulSoup(response.text, 'html.parser')# 找到所有的鏈接links = soup.find_all('a', href=True)# 用于存儲PDF文件的目錄pdf_directory = 'pdf_files'if not os.path.exists(pdf_directory): os.makedirs(pdf_directory)# 遍歷所有的鏈接,下載PDF文件for link in links: href = link['href'] if href.lower().endswith('.pdf'): # 完整的PDF文件URL pdf_url = url '/' href if href.startswith('/') else href # 從URL中提取文件名 filename = os.path.basename(pdf_url) # 下載PDF文件 with open(os.path.join(pdf_directory, filename), 'wb') as f: pdf_response = requests.get(pdf_url) pdf_response.raise_for_status() # 如果請求失敗,將拋出異常 f.write(pdf_response.content) print(f"Downloaded {filename}")print("All PDFs have been downloaded.")
從代碼看,Kimi是提取了</a>下所有的href元素并下載。查看這個網(wǎng)站的HTML代碼,可以看到href不但包括pdf的,還包括鏈接跳轉(zhuǎn)到其他shtml。而我們的需求是下載pdf文件
繼續(xù)提需求,讓kimi只下載pdf
import requestsfrom bs4 import BeautifulSoupimport os# 目標(biāo)網(wǎng)址url = "http://orthomolecular.org/resources/omns/index.shtml"# 發(fā)送HTTP請求,獲取網(wǎng)頁內(nèi)容response = requests.get(url)response.raise_for_status() # 確保請求成功# 使用BeautifulSoup解析HTML內(nèi)容soup = BeautifulSoup(response.text, 'html.parser')# 查找所有的<a>標(biāo)簽a_tags = soup.find_all('a', href=True)# 用于存儲PDF文件的目錄pdf_directory = 'pdf_files'if not os.path.exists(pdf_directory): os.makedirs(pdf_directory)# 遍歷所有的<a>標(biāo)簽for tag in a_tags: href = tag['href'] if href.lower().endswith('.pdf'): # 完整的PDF文件URL pdf_url = href # 假設(shè)所有的PDF鏈接都是絕對路徑 # 從URL中提取文件名 filename = os.path.basename(pdf_url) # 構(gòu)建完整的文件保存路徑 file_path = os.path.join(pdf_directory, filename) try: # 發(fā)送請求,下載PDF文件 pdf_response = requests.get(pdf_url, stream=True) pdf_response.raise_for_status() # 確保請求成功 with open(file_path, 'wb') as f: for chunk in pdf_response.iter_content(chunk_size=8192): f.write(chunk) print(f"Downloaded {filename}") except Exception as e: print(f"Failed to download {pdf_url}, error: {e}")print("Finished downloading PDFs.")
可以看到上面的代碼已經(jīng)增加了功能,過濾了href中不是以pdf結(jié)尾的。只下載pdf結(jié)尾的。代碼運(yùn)行。也滿足了我們的需求。該網(wǎng)站1000 個PDF文件成功下載
———–繼續(xù)優(yōu)化———–
那么這個功能還能繼續(xù)優(yōu)化么,轉(zhuǎn)換下思路,如果我把這個網(wǎng)站的HTML代碼保存成txt文檔,然后讓kimi去學(xué)習(xí)這個文檔,然后根據(jù)我的要求來下載。這個方法是否可行?
1 首先我將網(wǎng)站的源代碼保存成txt文檔,然后上傳給kimi
2 提供完整的提示詞
提供的代碼如下
import requestsfrom bs4 import BeautifulSoupimport osimport refrom urllib.parse import urljoin# 目標(biāo)網(wǎng)頁的URLurl = '你的目標(biāo)網(wǎng)頁URL'# 偽裝成瀏覽器的headersheaders = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}# 發(fā)送HTTP請求response = requests.get(url, headers=headers)response.raise_for_status() # 如果請求失敗,將拋出異常# 使用BeautifulSoup解析HTML內(nèi)容soup = BeautifulSoup(response.text, 'html.parser')# 查找所有的a標(biāo)簽,提取href屬性links = soup.find_all('a', href=True)# 正則表達(dá)式匹配PDF鏈接pdf_pattern = re.compile(r'.pdf', re.IGNORECASE)# 存儲所有PDF的鏈接pdf_links = [urljoin(url, link['href']) for link in links if pdf_pattern.search(link['href'])]# 下載PDF文檔for pdf_link in pdf_links: # 發(fā)送請求下載PDF pdf_response = requests.get(pdf_link, headers=headers) pdf_response.raise_for_status() # 從鏈接中提取PDF文件名 filename = re.findall(r'/([w_-] (.w ))$', pdf_link)[0][0] # 寫入文件系統(tǒng) with open(filename, 'wb') as f: f.write(pdf_response.content) print(f'Downloaded {filename}')print('All PDFs have been downloaded.')
這個代碼比較完善了,根據(jù)我的提示詞,kimi提供了header數(shù)據(jù)的組裝。避免被認(rèn)為是爬蟲。
總結(jié):
今天嘗試讓kimi變身一個爬蟲工程師,但是結(jié)果還是有遺憾,kimi現(xiàn)在還不具備分析網(wǎng)站的功能。但是如果你能準(zhǔn)確的告訴kimi,具體要爬哪些內(nèi)容,爬蟲的條件是什么。kimi還是能很好的完成工作