186 lines
7.3 KiB
Python
186 lines
7.3 KiB
Python
|
from selenium import webdriver
|
|||
|
from bs4 import BeautifulSoup
|
|||
|
from markdownify import markdownify as md
|
|||
|
import time
|
|||
|
import os
|
|||
|
from selenium.webdriver.edge.service import Service
|
|||
|
from selenium.webdriver import EdgeOptions
|
|||
|
import requests
|
|||
|
import json
|
|||
|
from selenium.webdriver.common.by import By
|
|||
|
|
|||
|
def crawlsleep(times):
|
|||
|
time.sleep(times)
|
|||
|
|
|||
|
def parser_beautiful(innerHTML, article, number, dircrea, bk=False):
|
|||
|
if not innerHTML:
|
|||
|
return article, number
|
|||
|
if bk:
|
|||
|
article += "**"
|
|||
|
if isinstance(innerHTML, str):
|
|||
|
article += innerHTML.text
|
|||
|
return article, number
|
|||
|
|
|||
|
for chi in innerHTML.children:
|
|||
|
# article, number = parser_beautiful(chi, article, number, dircrea, bk)
|
|||
|
tag_name = chi.name
|
|||
|
if isinstance(chi, str):
|
|||
|
article += chi.text
|
|||
|
continue
|
|||
|
else:
|
|||
|
cll = [c for c in chi.children]
|
|||
|
if tag_name in ['table', 'tbody', 'tr', 'td', 'u', 'em']:
|
|||
|
article, number = parser_beautiful(chi, article, number, dircrea, bk)
|
|||
|
elif tag_name=="br":
|
|||
|
article += "\n"
|
|||
|
elif tag_name=="p":
|
|||
|
article, number = parser_beautiful(chi, article, number, dircrea, bk)
|
|||
|
article += "\n\n"
|
|||
|
# elif tag_name=="br":
|
|||
|
# article += "<br>\n"
|
|||
|
elif tag_name in ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']:
|
|||
|
article += '#' * int(tag_name[-1]) + ' '
|
|||
|
article, number = parser_beautiful(chi, article, number, dircrea, bk)
|
|||
|
article += '\n\n'
|
|||
|
elif tag_name=="span":
|
|||
|
datatex = None
|
|||
|
classc = None
|
|||
|
if 'data-tex' in chi.attrs.keys():
|
|||
|
datatex = chi.attrs["data-tex"]
|
|||
|
if 'class' in chi.attrs.keys():
|
|||
|
classc = chi.attrs["class"]
|
|||
|
if datatex and classc and 'ztext-math' in classc:
|
|||
|
content = chi.attrs["data-tex"]
|
|||
|
while len(content) > 0 and ' '==content[0]:
|
|||
|
content = content[1:]
|
|||
|
while len(content) > 0 and ' '==content[-1]:
|
|||
|
content = content[:-1]
|
|||
|
if len(content) > 0:
|
|||
|
if article[-3-1:]=='<br>' or article[-1:]=='\n':
|
|||
|
article += "\n$" + content + "$"
|
|||
|
else:
|
|||
|
article += "$" + content + "$"
|
|||
|
else:
|
|||
|
article, number = parser_beautiful(chi, article, number, dircrea, bk)
|
|||
|
# article += nod.text
|
|||
|
elif tag_name=="a":
|
|||
|
linksite = None
|
|||
|
if 'href' in chi.attrs.keys():
|
|||
|
linksite = chi.attrs['href']
|
|||
|
if linksite:
|
|||
|
linksite = linksite.replace("//link.zhihu.com/?target=https%3A", "").replace("//link.zhihu.com/?target=http%3A", "")
|
|||
|
if len(article) > 0 and article[-1]=='\n':
|
|||
|
article += "["+chi.text+"]"+"("+linksite + ")"
|
|||
|
else:
|
|||
|
article += "\n\n["+chi.text+"]"+"("+linksite + ")"
|
|||
|
elif tag_name=='b' or tag_name=='strong':
|
|||
|
if len(cll) > 1:
|
|||
|
article, number = parser_beautiful(chi, article, number, dircrea, True)
|
|||
|
else:
|
|||
|
txt = chi.text
|
|||
|
while len(txt) > 0 and txt[-1] == " ":
|
|||
|
txt = txt[:-1]
|
|||
|
article += " **" + txt + "** "
|
|||
|
elif tag_name=="figure":
|
|||
|
noscript = chi.find_all('noscript')
|
|||
|
if len(noscript) > 0:
|
|||
|
chi.noscript.extract()
|
|||
|
imgchunk = chi.find_all('img')
|
|||
|
for i in range(len(imgchunk)):
|
|||
|
imglink = None
|
|||
|
if 'data-original' in imgchunk[i].attrs.keys():
|
|||
|
imglink = imgchunk[i].attrs["data-original"]
|
|||
|
|
|||
|
if 'data-actualsrc' in imgchunk[i].attrs.keys():
|
|||
|
imglink = imgchunk[i].attrs['data-actualsrc']
|
|||
|
|
|||
|
if imglink==None:
|
|||
|
imglink = imgchunk[i].attrs["src"]
|
|||
|
try:
|
|||
|
response = requests.get(imglink, timeout=30)
|
|||
|
except:
|
|||
|
try:
|
|||
|
response = requests.get(imglink, timeout=30)
|
|||
|
except:
|
|||
|
continue
|
|||
|
if response.status_code==200:
|
|||
|
with open(os.path.join(dircrea, str(number) + '.jpg'), 'wb') as obj:
|
|||
|
obj.write(response.content)
|
|||
|
|
|||
|
files = {'image': open(os.path.join(dircrea, str(number) + '.jpg'), 'rb')}
|
|||
|
response1 = requests.post('https://www.testingcloud.club/sapi/api/image_upload',
|
|||
|
files=files,timeout=30)
|
|||
|
if response1.status_code==200:
|
|||
|
continue
|
|||
|
# jsons = json.loads(response1.text)
|
|||
|
# print(jsons)
|
|||
|
# article += ''' <img src="https://www.testingcloud.club/sapi/api/image_download/%s" width="100%%"/> \n\n'''%jsons['url']
|
|||
|
|
|||
|
requests.put(imglink, timeout=30)
|
|||
|
number += 1
|
|||
|
crawlsleep(1)
|
|||
|
elif tag_name=="div":
|
|||
|
prenode = chi.find_all('code')
|
|||
|
if len(prenode) > 0:
|
|||
|
for i in prenode:
|
|||
|
article += "\n\n```\n" + i.text + "\n```\n\n"
|
|||
|
else:
|
|||
|
article, number = parser_beautiful(chi, article, number, dircrea, bk)
|
|||
|
article += "\n\n"
|
|||
|
if bk:
|
|||
|
article += "**"
|
|||
|
return article, number
|
|||
|
|
|||
|
|
|||
|
# Xpanx.com 专业网络爬虫程序定制,加微信 LiteMango(付费)
|
|||
|
# 设置webdriver路径,替换为你的webdriver路径
|
|||
|
abspath = os.path.abspath(__file__)
|
|||
|
|
|||
|
driverpath = os.path.join(abspath, 'msedgedriver\msedgedriver.exe')
|
|||
|
service = Service(executable_path=driverpath)
|
|||
|
edge_options = EdgeOptions()
|
|||
|
|
|||
|
#https://stackoverflow.com/questions/53039551/selenium-webdriver-modifying-navigator-webdriver-flag-to-prevent-selenium-detec
|
|||
|
edge_options.add_experimental_option('excludeSwitches', ['enable-automation'])
|
|||
|
edge_options.add_experimental_option('useAutomationExtension', False)
|
|||
|
edge_options.add_argument('lang=zh-CN,zh,zh-TW,en-US,en')
|
|||
|
edge_options.add_argument("disable-blink-features=AutomationControlled")#就是这一行告诉chrome去掉了webdriver痕迹
|
|||
|
|
|||
|
# 初始化webdriver
|
|||
|
driver = webdriver.Edge(options=edge_options, service = service)
|
|||
|
|
|||
|
# 微信公众号文章的 URL
|
|||
|
url = 'https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247483973&idx=2&sn=483265ffa9087ca956ec2d637119a5f8&chksm=ebd74344dca0ca5298b894fbb706c26ee942a423e858e27679f06df4b83899e1a97cc9d5eb97&scene=21###wechat_redirect'
|
|||
|
|
|||
|
# 打开页面
|
|||
|
driver.get(url)
|
|||
|
|
|||
|
# 等待一定时间让页面加载完成
|
|||
|
time.sleep(5)
|
|||
|
|
|||
|
# 获取页面的源代码
|
|||
|
html = driver.page_source
|
|||
|
|
|||
|
# 解析 HTML
|
|||
|
soup = BeautifulSoup(html, 'html.parser')
|
|||
|
|
|||
|
# 提取文章标题
|
|||
|
title = soup.find('h1', {'class': 'rich_media_title'}).get_text(strip=True)
|
|||
|
|
|||
|
# 提取文章内容
|
|||
|
content = soup.find('div', {'id': 'js_content'})
|
|||
|
richtext = driver.find_element(By.TAG_NAME, "section")
|
|||
|
article = ''
|
|||
|
print(content)
|
|||
|
inner = driver.execute_script("return arguments[0].innerHTML;", richtext)
|
|||
|
innerHTML = BeautifulSoup(inner, "html.parser")
|
|||
|
res,num = parser_beautiful(innerHTML,article,0,'d://',False)
|
|||
|
# 将 HTML 转换为 Markdown
|
|||
|
#markdown = md(str(content))
|
|||
|
|
|||
|
# 将 Markdown 写入文件
|
|||
|
with open(f'{title}.md', 'w', encoding='utf-8') as f:
|
|||
|
f.write(res)
|
|||
|
|
|||
|
# 关闭webdriver
|
|||
|
driver.quit()
|