深圳官方网站制作,北京活动策划网站,购物网站开发中遇到的问题,王占军博客正文#xff08;包含详细注释#xff09;
引言
在爬虫技术领域#xff0c;处理动态加载的网页内容常常是一项挑战#xff0c;尤其是对于那些通过用户滚动或其他交互动态加载更多内容的网站。本文将介绍如何结合使用Selenium和Scrapy来有效处理这类网页。
初探Seleni…博客正文包含详细注释
引言
在爬虫技术领域处理动态加载的网页内容常常是一项挑战尤其是对于那些通过用户滚动或其他交互动态加载更多内容的网站。本文将介绍如何结合使用Selenium和Scrapy来有效处理这类网页。
初探Selenium与Scrapy的结合
首先我们探索如何使用Selenium在Scrapy中间件中处理动态加载内容的网页。关键在于模拟用户滚动行为以加载并捕获所有内容。
def process_response(self, request, response, spider):driver spider.driver# 检查请求的URL是否在我们的目标列表中if request.url in spider.page_url:driver.get(request.url) # 使用Selenium打开页面# 等待页面初步加载完成time.sleep(3) # 示例等待时间可能需要根据实际页面调整# 获取当前页面的高度last_height driver.execute_script(return document.body.scrollHeight)while True:# 滚动到页面底部driver.execute_script(window.scrollTo(0, document.body.scrollHeight);)# 等待页面可能出现的新内容加载time.sleep(3) # 重新获取新的页面高度new_height driver.execute_script(return document.body.scrollHeight)# 如果高度不再改变说明到达了页面底部if new_height last_height:breaklast_height new_height # 更新高度用于下次比较# 获取完整的页面源代码text driver.page_source# 创建新的HtmlResponse并返回return HtmlResponse(urlrequest.url, bodytext, encodingutf-8, requestrequest)# 如果URL不在目标列表中返回原始响应return response完整的Scrapy爬虫实例
下面是一个使用Selenium和Scrapy爬取网易新闻的示例。
import scrapy
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.chrome.options import Optionsclass WySpider(scrapy.Spider):name wy # 爬虫名称start_urls [https://news.163.com/domestic/] # 起始URL# Selenium配置opt Options()opt.add_argument(--headless) # 添加headless参数指定浏览器在无界面模式下运行即没有用户界面或可视化界面的情况下。opt.add_argument(--disable-gpu) # 禁用GPU加速opt.add_argument(--window-size4000,1600) # 设置浏览器窗口大小opt.add_experimental_option(excludeSwitches, [enable-automation]) # 防止网站识别出自动化测试driver Chrome(optionsopt) # 创建Chrome驱动href_index [1, 2] # 指定要处理的链接索引page_url [] # 存储目标URL地址# 处理起始URL的响应def parse(self, resp, **kwargs):# 提取链接href_list resp.xpath(/html/body/div/div[3]/div[2]/div[2]/div/ul/li/a/href).extract()for i in range(len(href_list)):if i in self.href_index:# 如果链接在指定索引中添加到目标列表并发起请求self.page_url.append(href_list[i])yield scrapy.Request(urlhref_list[i], callbackself.parse_detail)# 处理获取的新闻类别链接def parse_detail(self, resp, **kwargs):# 提取详细页面的链接detail_url resp.xpath(/html/body/div/div[3]/div[3]/div[1]/div[1]/div/ul/li/div/div/div/div[1]/h3/a/href).extract()for url in detail_url:# 对每个详细新闻链接发起请求yield scrapy.Request(urlurl, callbackself.parse_detail_content)# 提取并处理新闻详细内容def parse_detail_content(self, resp, **kwargs):# 提取新闻标题title resp.xpath(//*[idcontain]/div[2]/h1/text()).extract_first()# 提取新闻内容con resp.xpath(//*[idcontent]/div[2]//text()).extract()con .join(con).strip()data {title: title, con: con} # 封装提取的数据print(data) # 打印数据yield data # 返回提取的数据使用场景
这种结合Selenium和Scrapy的方法适用于需要处理动态加载内容的网页如新闻网站、社交媒体平台等。
结语
通过结合Selenium和Scrapy我们可以有效地处理那些动态加载内容的网页这对于数据抓取和网络爬虫项目至关重要。希望这篇文章能够帮助您在面对类似的挑战时有所启发和帮助。