import scrapy
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from scrapy.selector import Selector
from jdscrapy.items import JdscrapyItem
from time import sleep
class JingdongSpider(scrapy.Spider):
name = 'jingdong'
custom_settings = {'REACTOR_THREADPOOL_MAXSIZE': 20}
allowed_domains = ['www.jd.com']
start_urls = ['https://www.jd.com']
def __init__(self):
# 设置 Chrome 无头模式
chrome_options = Options()
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--disable-software-rasterizer")
# chrome_options.add_argument("--headless") # 启用无头模式
# 使用 Chrome 初始化 WebDriver,确保将选项传递给WebDriver
self.driver = webdriver.Chrome(options=chrome_options)
def parse(self, response):
# 使用 Selenium 打开页面
self.driver.get(self.start_urls[0])
# 使用显式等待确保异步加载完成
wait = WebDriverWait(self.driver, 5)
# 模拟向下滚动
for i in range(1):
self.driver.execute_script("window.scrollTo(0, 0.3*document.body.scrollHeight);")
sleep(2)
# 首先搜索“时尚达人模块”
# 查找并点击指定按钮
fashion_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//span[contains(text(), '时尚达人')]")))
fashion_button.click()
sleep(5)
# 循环滚动和解析
for _ in range(10): # 滚动次数
# 模拟向下滚动
self.driver.execute_script("window.scrollTo(0, 0.8*document.body.scrollHeight);")
sleep(6)
# 获取页面源码
body = self.driver.page_source
selector = Selector(text=body)
# 解析页面内容
commodities = selector.xpath('//*[@id="feedContent4"]/li')
for commodity in commodities:
item = JdscrapyItem()
image = commodity.xpath('.//a/div[1]/img/@src').extract_first()
item['image'] = 'https:' + image if image else ''
item['text'] = commodity.xpath('.//a/div[2]/p/text()').extract_first()
price_1 = commodity.xpath('.//a/div[2]/div/div/span/text()').extract()
price_2 = commodity.xpath('.//a/div[2]/div/div/span/span/text()').extract()
item['price'] = ''.join(price_1) + ''.join(price_2)
link = commodity.xpath('.//a/@href').extract_first()
item['link'] = 'https:' + link if link else ''
# 使用 yield 将item传递给item pipeline
yield item
# 第二波,搜索“智能先锋”模块
# 使用 Selenium 打开页面
self.driver.get(self.start_urls[0])
# 使用显式等待确保异步加载完成
wait = WebDriverWait(self.driver, 5)
# 模拟向下滚动
for i in range(1):
self.driver.execute_script("window.scrollTo(0, 0.3*document.body.scrollHeight);")
sleep(2)
# 查找并点击指定按钮
fashion_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//span[contains(text(), '智能先锋')]")))
fashion_button.click()
sleep(5)
# 循环滚动和解析
for _ in range(10): # 滚动次数
# 模拟向下滚动
self.driver.execute_script("window.scrollTo(0, 0.8*document.body.scrollHeight);")
sleep(6)
# 获取页面源码
body = self.driver.page_source
selector = Selector(text=body)
# 解析页面内容
commodities = selector.xpath('//*[@id="feedContent1"]/li')
for commodity in commodities:
item = JdscrapyItem()
image = commodity.xpath('.//a/div[1]/img/@src').extract_first()
item['image'] = 'https:' + image if image else ''
item['text'] = commodity.xpath('.//a/div[2]/p/text()').extract_first()
price_1 = commodity.xpath('.//a/div[2]/div/div/span/text()').extract()
price_2 = commodity.xpath('.//a/div[2]/div/div/span/span/text()').extract()
item['price'] = ''.join(price_1) + ''.join(price_2)
link = commodity.xpath('.//a/@href').extract_first()
item['link'] = 'https:' + link if link else ''
# 使用 yield 将item传递给item pipeline
yield item
# 第三波,搜索“进口好物”模块
# 使用 Selenium 打开页面
self.driver.get(self.start_urls[0])
# 使用显式等待确保异步加载完成
wait = WebDriverWait(self.driver, 5)
# 模拟向下滚动
for i in range(1):
self.driver.execute_script("window.scrollTo(0, 0.3*document.body.scrollHeight);")
sleep(2)
# 查找并点击指定按钮
fashion_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//span[contains(text(), '进口好物')]")))
fashion_button.click()
sleep(5)
# 循环滚动和解析
for _ in range(10): # 滚动次数
# 模拟向下滚动
self.driver.execute_script("window.scrollTo(0, 0.8*document.body.scrollHeight);")
sleep(6)
# 获取页面源码
body = self.driver.page_source
selector = Selector(text=body)
# 解析页面内容
commodities = selector.xpath('//*[@id="feedContent5"]/li')
for commodity in commodities:
item = JdscrapyItem()
image = commodity.xpath('.//a/div[1]/img/@src').extract_first()
item['image'] = 'https:' + image if image else ''
item['text'] = commodity.xpath('.//a/div[2]/p/text()').extract_first()
price_1 = commodity.xpath('.//a/div[2]/div/div/span/text()').extract()
price_2 = commodity.xpath('.//a/div[2]/div/div/span/span/text()').extract()
item['price'] = ''.join(price_1) + ''.join(price_2)
link = commodity.xpath('.//a/@href').extract_first()
item['link'] = 'https:' + link if link else ''
# 使用 yield 将item传递给item pipeline
yield item
# 关闭浏览器
self.driver.quit()
使用Scrapy框架,辅加以Selenium库,解决JavaScript动态加载问题,爬取京东网站商品信息
需积分: 0 186 浏览量
更新于2023-11-25
收藏 12KB ZIP 举报
使用Scrapy框架,爬取京东网站商品信息,为了解决JavaScript动态加载问题,通过辅加以Selenium库的方式,使用WebDriver函数,创建虚拟浏览器,模拟真实用户的操作情况,通过滚动、点击按钮等操作模仿用户行为并获得更多信息。主要避免下载Docker板块,且更好、更加便捷的获取信息。代码主要通过登录京东网页,获取“时尚达人”,“智能先锋”和“进口好物”等商品信息,并将数据保存为CSV、Excel和JSON等多种格式,只需要稍微修改文件保存路径即可使用,简单便捷。
青丝几渐
- 粉丝: 0
- 资源: 1
最新资源
- 光储并网VSG系统Matlab simulink仿真模型,附参考文献 系统前级直流部分包括光伏阵列、变器、储能系统和双向dcdc变器,后级交流子系统包括逆变器LC滤波器,交流负载 光储并网VSG系
- file_241223_024438_84523.pdf
- 质子交膜燃料电池PEMFC Matlab simulink滑模控制模型,过氧比控制,温度控制,阴,阳极气压控制
- IMG20241223015444.jpg
- 模块化多电平变器(MMC),本模型为三相MMC整流器 控制策略:双闭环控制、桥臂电压均衡控制、模块电压均衡控制、环流抑制控制策略、载波移相调制,可供参考学习使用,默认发2020b版本及以上
- Delphi 12 控件之FlashAV FFMPEG VCL Player For Delphi v7.0 for D10-D11 Full Source.7z
- Delphi 12 控件之DevExpressVCLProducts-24.2.3.exe.zip
- Mysql配置文件优化内容 my.cnf
- 中国地级市CO2排放数据(2000-2023年).zip
- smart200光栅报警程序