1. from selenium import webdriver
    2. import os
    3. import time
    4. import html2text as ht
    5. from bs4 import BeautifulSoup
    6. import parsel
    7. from selenium.webdriver.chrome.options import Options
    8. from selenium.webdriver import ChromeOptions
    9. # html模板,主要是为了设置来解决乱码问题
    10. html = """
    11. {content}
    12. """
    13. # md文件存储路径
    14. path = "./文件"
    15. #初始化浏览器
    16. def init():
    17. # 实现无可视化界面的操作
    18. chrome_options = Options()
    19. chrome_options.add_argument('--headless')
    20. chrome_options.add_argument('--disable-gpu')
    21. # 实施规避检测
    22. option = ChromeOptions()
    23. option.add_experimental_option('excludeSwitches', ['enable-automation'])
    24. # 把无可视化界面和规避检测设置进去
    25. driver = webdriver.Chrome(chrome_options=chrome_options,options=option)
    26. #请求CSDN
    27. driver.get("https://www.csdn.net/")
    28. time.sleep(0.5)
    29. #操控浏览器滑轮滑到底部
    30. driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
    31. #继续操控浏览器滑轮进行逐步滑动
    32. #如果想要爬取更多文章,可控制滑轮向下多滑
    33. for y in range(10):
    34. #0,200 每次滑动200像素
    35. js = 'window.scrollBy(0,200)'
    36. driver.execute_script(js)
    37. time.sleep(0.5)
    38. time.sleep(3)
    39. #返回driver
    40. return driver
    41. #爬取
    42. def Crawling(driver):
    43. #使用lxml库解析
    44. data = BeautifulSoup(driver.page_source, "lxml")
    45. #参考图1,先定位到feedlist_mod home,在获取其下的全部class为clearfix的li标签
    46. li_list = data.find(class_="feedlist_mod home").find_all(class_="clearfix")
    47. #遍历li_list
    48. for li in li_list:
    49. li_data = BeautifulSoup(str(li), "lxml")
    50. #异常处理,对于有的没有详情页url的那肯定不是博客文章,直接continue
    51. try:
    52. # 详情页url,参考图2
    53. page_url = li_data.find("a")["href"]
    54. except:
    55. continue
    56. # 如果是官方直播就跳过
    57. if li_data.find(class_="name").find("a").text.strip() == '官方直播':
    58. continue
    59. # 文章标题,参考图2
    60. title = li_data.find("a").text.replace(" ", "")
    61. #进行详情页请求爬取
    62. page_Crawling(title,page_url,driver)
    63. #详情页爬取并保存为md文件
    64. def page_Crawling(title,page_url,driver):
    65. # 如果不存在就创建该文件夹
    66. if not os.path.exists(path):
    67. os.makedirs(path)
    68. #向详情页发起get请求
    69. driver.get(page_url)
    70. #使用Selectors选择器
    71. selector = parsel.Selector(driver.page_source)
    72. #使用CSS获取,可参考图3,文章只有一个article标签
    73. text = selector.css("article").get()
    74. #先保存为html
    75. with open("text.html", "w", encoding="utf-8") as f:
    76. #需要设置html模板,不然出现乱码
    77. f.write(html.format(content=text))
    78. #这里我们使用html2text库将html转为markdown
    79. text_maker = ht.HTML2Text()
    80. # 读取html格式文件
    81. with open('text.html', 'r', encoding='UTF-8') as f:
    82. htmlpage = f.read()
    83. # 处理html格式文件中的内容
    84. text = text_maker.handle(htmlpage)
    85. # 写入处理后的内容
    86. with open(path + "/" + title + '.md', 'w', encoding="utf-8") as f:
    87. f.write(text)
    88. print(title + "爬取完毕")
    89. #开始
    90. if __name__ == "__main__":
    91. #初始化
    92. driver = init()
    93. #爬取
    94. Crawling(driver)