selenium处理网页下拉加载数据爬取并存入excel

前言

之前有个同学询问我是否能够爬取知乎的全部回答,当初只会Scrapy无法实现下拉的数据全部加载。后来在意外中接触了selenium的自动化测试,看出了selenium的模拟能力的强大,而昨天有个同学问我能否爬取中国工商银行远程银行的精彩回答,我说可以试试。

思路

  1. selenium模拟下拉直至底部
  2. 然后通过selenium获取数据集合
  3. 通过pandas写入excel

selenium模拟下拉直至底部

此处全靠一位大佬的博客点拨,实在不好意思的是,selenium就看了下常用的api,实在不懂如何判断是否加载完毕,而该博客代码的原理也好理解,通过不断下拉判断与上一次高度进行对比,知道前端页面的滚动高度属性就懂了,当然思想最重要。
见代码:

#将滚动条移动到页面的底部
all_window_height =  []  # 创建一个列表,用于记录每一次拖动滚动条后页面的最大高度
all_window_height.append(self.driver.execute_script("return document.body.scrollHeight;")) #当前页面的最大高度加入列表
while True:
	self.driver.execute_script("scroll(0,100000)") # 执行拖动滚动条操作
	time.sleep(3)
	check_height = self.driver.execute_script("return document.body.scrollHeight;")
	if check_height == all_window_height[-1]:  #判断拖动滚动条后的最大高度与上一次的最大高度的大小,相等表明到了最底部
		print("我已下拉完毕")
		break
	else:
		all_window_height.append(check_height) #如果不想等,将当前页面最大高度加入列表。
		print("我正在下拉")

然后通过selenium获取数据集合

通过find_elements_by_css_selector方法获取元素对象列表,然后通过遍历列表获取单个对象,通过对象的text属性获取数据。
代码与"通过pandas写入excel"代码想结合。

通过pandas写入excel

example.xlsx

example.xlsx
批量将数据依次写入excel,此处个人知道有两种写法,推荐后者。
写法一:

problem = cls.driver.find_elements_by_css_selector("li h2.item-title a")
data = pd.read_excel('example.xlsx', sheet_name = 'Sheet1')
problemtext = []
for i in problem:
	problemtext .append(i.text)
replytext = []
reply = cls.driver.find_elements_by_css_selector("div.item-right p")
for j in reply:
    replytext.append(j.text)
    data.loc[row,'答案'] = j.text
data['问题'] = problemtext
data['答案'] = replytext

DataFrame(data).to_excel('test.xlsx', sheet_name='Sheet1')

写法二:

problem = cls.driver.find_elements_by_css_selector("li h2.item-title a")
data = pd.read_excel('example.xlsx', sheet_name = 'Sheet1')
row = 1
for i in problem:
    data.loc[row,'问题'] = i.text
    row += 1
row = 1
reply = cls.driver.find_elements_by_css_selector("div.item-right p")
for j in reply:
    data.loc[row,'答案'] = j.text
    row += 1

DataFrame(data).to_excel('test.xlsx', sheet_name='Sheet1')

完整代码

import pandas as pd
from pandas import DataFrame
import unittest
import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait

class autoLogin(unittest.TestCase):
	
	URL = 'http://zhidao.baidu.com/business/profile?id=87701'


	@classmethod
	def setUpClass(cls):
		cls.driver = webdriver.Firefox()
		cls.driver.implicitly_wait(20)
		cls.driver.maximize_window()

		
	
	def test_search_by_selenium(self):
		self.driver.get(self.URL)
		self.driver.title
		time.sleep(1)
		#将滚动条移动到页面的底部
		all_window_height =  []
		all_window_height.append(self.driver.execute_script("return document.body.scrollHeight;"))
		while True:
			self.driver.execute_script("scroll(0,100000)") 
			time.sleep(3)
			check_height = self.driver.execute_script("return document.body.scrollHeight;")
			if check_height == all_window_height[-1]:  
				print("我已下拉完毕")
				break
			else:
				all_window_height.append(check_height) 
				print("我正在下拉")
				
	@classmethod
	def tearDownClass(cls):
		html=cls.driver.page_source
		problem = cls.driver.find_elements_by_css_selector("li h2.item-title a")
		data = pd.read_excel('example.xlsx', sheet_name = 'Sheet1')
		row = 1
		for i in problem:
		    data.loc[row,'问题'] = i.text
		    row += 1
		row = 1
		reply = cls.driver.find_elements_by_css_selector("div.item-right p")
		for j in reply:
		    data.loc[row,'答案'] = j.text
		    row += 1
		    
		DataFrame(data).to_excel('test.xlsx', sheet_name='Sheet1')

		#保存成网页
		with open("index.html", "wb") as f:
			f.write(html.encode())
		f.close()
		cls.driver.quit()

if __name__ == '__main__':
	unittest.main(verbosity=2)

展示

text.xlsx

text.xlsx

总结

在使用Scrapy爬虫时,可以通过selenium来执行网页中的一些js脚本,但是如何将二者结合起来,以及各种框架之间的灵活运用,都将是我需要面对的。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当使用 Scrapy 和 Selenium 结合进行网页动态加载数据爬取时,可以按照以下步骤进行操作: 1. 安装所需库:确保已安装 Scrapy 和 Selenium 库。可以使用以下命令进行安装: ``` pip install scrapy pip install selenium ``` 2. 创建 Scrapy 项目:使用以下命令创建一个新的 Scrapy 项目: ``` scrapy startproject dynamic_scraping ``` 3. 创建 Spider:进入项目目录,并使用以下命令创建一个新的 Spider: ``` cd dynamic_scraping scrapy genspider example example.com ``` 这将在 `spiders` 目录下创建一个名为 `example.py` 的 Spider。 4. 配置 Spider:打开 `example.py` 文件,并按照以下示例进行配置: ```python import scrapy from scrapy_selenium import SeleniumRequest from scrapy.selector import Selector class ExampleSpider(scrapy.Spider): name = 'example' allowed_domains = ['example.com'] def start_requests(self): yield SeleniumRequest( url='https://example.com', callback=self.parse ) def parse(self, response): sel = Selector(response) # 在这里使用 XPath 或 CSS 选择器提取动态加载数据 # 示例:提取标题 title = sel.xpath('//h1/text()').get() print(title) ``` 在上面的示例中,我们使用了 `SeleniumRequest` 替代了普通的 `scrapy.Request`,这使得 Scrapy 可以使用 Selenium处理动态加载的内容。 5. 配置 Selenium:为了使用 Selenium,你需要配置相关的 Web 驱动程序。根据你使用的浏览器,下载并安装相应的驱动程序,并将其添加到系统的 PATH 环境变量中。 6. 运行 Spider:使用以下命令运行 Spider: ``` scrapy crawl example ``` 这将启动爬取过程,并在控制台上打印出提取的动态加载数据。 通过以上步骤,你可以使用 Scrapy 和 Selenium 结合进行爬取动态加载数据的操作。你可以根据实际需求修改 Spider 中的代码来提取所需的数据,并将其保存到文件或数据库中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值