0


Python爬虫:Selenium+BeautifulSoup解析动态HTML页面【附完整代码】

前言

  1. 前短时间,为了验证公司的验证码功能存在安全漏洞,写了一个爬虫程序抓取官网图库,然后通过二值分析,破解验证码进入系统刷单。 其中,整个环节里关键的第一步就是拿到数据 -- Python 爬虫技。
  2. 今天,我打算把爬虫经验分享一下,因为不能泄露公司核心信息,所以我随便找了一个第三方网站——**《懂车帝》**做演示。为了展示Selenium效果,网站需满足:需要动态加载(下拉)才能获取完整(或更多)数据的网页,如:淘宝,京东,拼多多的商品也都可以。
  3. 通过本篇,你将学会通过Selenium自动化加载HTML的技巧,并利用 BeautifulSoup 解析静态的HTML页面,还有使用 xlwt 插件操作 Excel
  4. 本文仅教学使用,无任何攻击行为或意向。


正文

一、页面分析

1. 打开页面,提取关键信息

  1. 首先,打开“某瓣电影一周新片榜”的页面:https://www.dongchedi.com/sales,截图省略了下面列表部分。
  2. 然后,提取榜单里的关键信息,如:当前月份,汽车排名,图片链接,汽车名称,汽车品牌,评论数等,这是我们需要爬取的数据,接下来就需要弄清楚他们在 Html 中的位置。

2. 分析Html页面

  1. Chrome浏览器 - F12】检查下 Html 页面结构,找到排行榜数据的具体位置,这对我们后续利用 Selenium BeautifulSoup 解析至关重要。
  2. 下面图片里可以看到,月份信息在 “<div class="more_more__z2kQC"></div>” 标签里(篇幅原因,没有展示全),而当月的榜单信息在"<li class="list_item__3gOKl">"的标签里,10条 “<tr></tr> ”标签形成一个List集合。
  3. **注意:**当前页面第一次进来页面只会加载出10条记录,如果想要获取全量的排行榜数据,我们需要用到 Selenium 技术动态加载页面,直到数据全部加载出来为止。

3. 结果展示

  1. 以我当前的时间为例——“20228月”,一共有“TOP542”条数据。


二、代码讲解

1. 导入关键库

  1. import time # time函数
  2. import xlwt # 进行excel操作
  3. import os.path # os读写
  4. from bs4 import BeautifulSoup # 解析html的
  5. from selenium import webdriver # selenium 驱动
  6. from selenium.webdriver.common.by import By
  7. from selenium.webdriver.common.keys import Keys # 模仿键盘
  8. from selenium.webdriver.support.wait import WebDriverWait # 导入等待类
  9. from selenium.webdriver.support import expected_conditions as EC # 等待条件

2. Selenium 解析动态Html

  1. 因为当前页面没有明显的元素用来判断拉到什么位置就是底部,所以我的规则是:一直循环,直到连续5 Keys.PAGE_DOWN(下拉),<li> 标签数量不再增加,就认为已经到底了。为了避免程序计算太快,每次下拉还停顿了0.2秒,实际效果不错。
  1. while (flag):
  2. _input.send_keys(Keys.PAGE_DOWN)
  3. driver.implicitly_wait(2)
  4. elem = driver.find_elements(By.CLASS_NAME, "list_item__3gOKl")
  5. len_cur = len(elem)
  6. print(len_now, len_cur)
  7. if (len_now != len_cur):
  8. len_now = len_cur
  9. num = 0
  10. elif (len_now == len_cur and num <= 5):
  11. num = num + 1
  12. time.sleep(0.5)
  13. else:
  14. time.sleep(2)
  15. break

3. Selenium 转 BeautifulSoup

  1. 根据小编的开发经验,selenium 很擅长模拟和测试,它动态加载的特性是 BeautifulSoup 具备的。但是,对于取值操作,简单的还好,复杂点的比如:循环<li>标签这种操作,我还是觉得BeautifulSoup更方便。
  2. 在爬虫的世界里,大量有价值的数据都是循环展现的,比如:某排行榜,某商品列表等...所以,Selenium + BeautifulSoup的操作必不可少。
  3. 核心代码也非常简单,直接传入 Selenium 驱动 driver,用 page_source() 就可以啦。
  1. # 获取完整渲染的网页源代码
  2. pageSource = driver.page_source
  3. soup = BeautifulSoup(pageSource, 'html.parser')
  4. soup.prettify()

4. 保存数据

  1. # 创建workbook对象
  2. book = xlwt.Workbook(encoding="utf-8",style_compression=0)
  3. # 创建工作表
  4. sheet = book.add_sheet('懂车帝想月销量排行榜', cell_overwrite_ok=True)
  5. col = ("排名", "图片链接", "名称", "品牌", "指导价", "销量")
  6. book.save("销量排行榜.xls")

三、完整代码

  1. 细节有待提高,下面的代码大家装好插件,直接拖到本地运行就可以了。

** 如果遇到环境问题,未知异常等,请参照博文:**关于:Python基础,爬虫,常见异常和面试【篇】(专题汇总)

  1. # -*- codeing = utf-8 -*-
  2. import time # time函数
  3. import xlwt # 进行excel操作
  4. import os.path # os读写
  5. from bs4 import BeautifulSoup # 解析html的
  6. from selenium import webdriver # selenium 驱动
  7. from selenium.webdriver.common.by import By
  8. from selenium.webdriver.common.keys import Keys # 模仿键盘
  9. from selenium.webdriver.support.wait import WebDriverWait # 导入等待类
  10. from selenium.webdriver.support import expected_conditions as EC # 等待条件
  11. # 获取全量数据的 selenium 驱动
  12. def readHtml(baseurl, flag):
  13. print("—————————— Read Html ——————————")
  14. # 打开浏览器
  15. driver = webdriver.Chrome()
  16. driver.get(baseurl)
  17. wait = WebDriverWait(driver, 10)
  18. wait.until(EC.presence_of_element_located((By.CLASS_NAME, "tw-mt-12")))
  19. # 动态加载排行榜数据
  20. # 我的规则:一直循环,直到连续5次下拉,<li>标签数量不再增加,则认为已经到底了
  21. num, len_now = 0, 0
  22. _input = driver.find_element(By.CLASS_NAME, "body")
  23. while (flag):
  24. _input.send_keys(Keys.PAGE_DOWN)
  25. driver.implicitly_wait(2)
  26. elem = driver.find_elements(By.CLASS_NAME, "list_item__3gOKl")
  27. len_cur = len(elem)
  28. print(len_now, len_cur)
  29. if (len_now != len_cur):
  30. len_now = len_cur
  31. num = 0
  32. elif (len_now == len_cur and num <= 5):
  33. num = num + 1
  34. time.sleep(0.5)
  35. else:
  36. time.sleep(2)
  37. break
  38. return driver
  39. # 将 selenium 驱动转 bs 形式的 html 页面
  40. def getHtml(driver):
  41. print("—————————— Get Html ——————————")
  42. # 获取完整渲染的网页源代码
  43. pageSource = driver.page_source
  44. soup = BeautifulSoup(pageSource, 'html.parser')
  45. soup.prettify()
  46. return soup
  47. # 从 html 页面爬取数据
  48. def getData(soup):
  49. print("—————————— Get Data ——————————")
  50. # 1. 时间
  51. dataTime = soup.find('div', class_="more_more__z2kQC").span.text
  52. # 2. 数据,查找符合要求的字符串
  53. index = 0 # 排行
  54. datalist = [] # 用来存储爬取的网页信息
  55. try:
  56. for item in soup.find_all('li', class_="list_item__3gOKl"):
  57. data = [] # 保存一条数据用
  58. print(item)
  59. # 2.1 生成一条记录
  60. index = index + 1
  61. data.append(index)
  62. data.append(item.find('div', class_='tw-p-12').div.div.img["src"])
  63. dd = item.find('div', class_='tw-py-16 tw-pr-12')
  64. data.append(dd.div.a.text)
  65. data.append(dd.div.span.text)
  66. data.append(dd.p.text)
  67. data.append(item.find('div', class_='tw-py-16 tw-text-center').div.p.text)
  68. # 2.2 存入list
  69. datalist.append(data)
  70. except Exception as e:
  71. print(e)
  72. pass
  73. return dataTime, datalist
  74. # 保存数据到表格
  75. def saveData(datalist, savepath):
  76. print("—————————— save ——————————")
  77. book = xlwt.Workbook(encoding="utf-8",style_compression=0) # 创建workbook对象
  78. sheet = book.add_sheet(dataTime, cell_overwrite_ok=True) # 创建工作表。sheet页名为dataTime
  79. col = ("排名", "图片链接", "名称", "品牌", "指导价", "销量")
  80. for i in range(0, len(col)):
  81. sheet.write(0, i, col[i]) # 列名
  82. for i in range(0, len(datalist)):
  83. # print("第%d条" %(i+1)) # 输出语句,用来测试
  84. data = datalist[i]
  85. for j in range(0, len(col)):
  86. sheet.write(i+1, j, data[j]) # 数据
  87. if os.path.exists(savepath): # 清空路径
  88. os.remove(savepath)
  89. book.save(savepath) # 保存
  90. pass
  91. if __name__ == "__main__":
  92. print("—————————— 开始执行 ——————————")
  93. # 1. 读取url
  94. html = readHtml("https://www.dongchedi.com/sales", True)
  95. # 2. selenium转BeautifulSoup
  96. soup = getHtml(html)
  97. # 3. 处理Html数据
  98. dataTime, dataList = getData(soup)
  99. # 4. 保存数据
  100. saveData(dataList, dataTime + "汽车销量排行总榜.xls")
  101. print("—————————— 爬取完毕 ——————————")

标签: python 爬虫 selenium

本文转载自: https://blog.csdn.net/weixin_44259720/article/details/127075628
版权归原作者 Java Punk 所有, 如有侵权,请联系我们删除。

“Python爬虫:Selenium+BeautifulSoup解析动态HTML页面【附完整代码】”的评论:

还没有评论