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动态加载问题,爬取京东网站商品信息
共14个文件
py:7个
pyc:6个
cfg:1个
需积分: 0 1 下载量 6 浏览量
2023-11-25
11:58:18
上传
评论
收藏 12KB ZIP 举报
温馨提示
使用Scrapy框架,爬取京东网站商品信息,为了解决JavaScript动态加载问题,通过辅加以Selenium库的方式,使用WebDriver函数,创建虚拟浏览器,模拟真实用户的操作情况,通过滚动、点击按钮等操作模仿用户行为并获得更多信息。主要避免下载Docker板块,且更好、更加便捷的获取信息。代码主要通过登录京东网页,获取“时尚达人”,“智能先锋”和“进口好物”等商品信息,并将数据保存为CSV、Excel和JSON等多种格式,只需要稍微修改文件保存路径即可使用,简单便捷。
资源推荐
资源详情
资源评论
收起资源包目录
jdscrapy.zip (14个子文件)
scrapy.cfg 259B
jdscrapy
__init__.py 0B
pipelines.py 2KB
spiders
__init__.py 161B
jingdong.py 6KB
__pycache__
jingdong.cpython-39.pyc 3KB
__init__.cpython-39.pyc 178B
items.py 334B
settings.py 4KB
__pycache__
items.cpython-39.pyc 430B
__init__.cpython-39.pyc 170B
settings.cpython-39.pyc 1019B
pipelines.cpython-39.pyc 3KB
middlewares.py 4KB
共 14 条
- 1
资源评论
青丝几渐
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功