当前位置: 代码迷 >> 综合 >> 动态爬取京东之---selenium+beautifulsoup+xpath提取
  详细解决方案

动态爬取京东之---selenium+beautifulsoup+xpath提取

热度:62   发布时间:2024-02-01 04:47:04.0

京东爬取

1.思路

1.通过selenium中的webdriver来进入需要爬取的物品输入框
2.由于是动态页面无法直接提取信息,所以需要通过写入js代码来模拟下拉操作
3.通过bs4中的beautifulsoup来采集信息(我更喜欢xpath)
4.通过启动模拟点击下一页按钮来实现跳转下页功能

2.代码展示

#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup as bsfrom selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')#打开目标网址
search = input('请输入要搜索的商品:')
driver = webdriver.Chrome(executable_path='chromedriver.exe',chrome_options=chrome_options)#声明谷歌浏览器对象
first_url = 'https://www.jd.com/' #入口url
driver.get(first_url)
# driver.maximize_window() #窗口最大化
#找到搜索框
driver.find_element_by_xpath('//*[@id="key"]').clear()
#传入商品
driver.find_element_by_xpath('//*[@id="key"]').send_keys(search)
#搜索商品
driver.find_element_by_xpath('//*[@id="key"]').send_keys(Keys.ENTER)
index = 0for page in range(1,6):# 声明基础高度height = 0for i in range(1, 11):js = 'var q=document.documentElement.scrollTop=%s' % heightheight += 800driver.execute_script(js)time.sleep(1)# 利用bs4采集相关信息text = driver.page_sourcesoup = bs(text, 'html.parser')lis = soup.find_all('li', class_='gl-item')for li in lis:print("*"*100)index += 1print(li.find('div',class_='p-price').text.strip())print(li.find('div', class_='p-name').text.strip())print(li.find('div', class_='p-shop').text.strip())print('http:'+li.find('div', class_='p-img').a.img.attrs['src'])time.sleep(3)driver.find_elements_by_xpath('//*[@id="J_bottomPage"]/span[1]/a')[-1].click()print('总数据总量{}条'.format(index))

3.代码详解

#打开目标网址
search = input('请输入要搜索的商品:')
driver = webdriver.Chrome(executable_path='chromedriver.exe',chrome_options=chrome_options)#声明谷歌浏览器对象
first_url = 'https://www.jd.com/' #入口url
driver.get(first_url)
# driver.maximize_window() #窗口最大化
#找到搜索框
driver.find_element_by_xpath('//*[@id="key"]').clear()
#传入商品
driver.find_element_by_xpath('//*[@id="key"]').send_keys(search)
#搜索商品
driver.find_element_by_xpath('//*[@id="key"]').send_keys(Keys.ENTER)

这些代码是通过selenium来获取商品的详情页,其中下面三行代码是为了加快爬取速度而采取无头模式。(执行过程不显示)

from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
# 声明基础高度height = 0for i in range(1, 11):js = 'var q=document.documentElement.scrollTop=%s' % heightheight += 800driver.execute_script(js)time.sleep(1)

这些代码是通过js修改下拉框的参数从而模拟下拉操作。

# 利用bs4采集相关信息text = driver.page_sourcesoup = bs(text, 'html.parser')lis = soup.find_all('li', class_='gl-item')for li in lis:print("*"*100)index += 1print(li.find('div',class_='p-price').text.strip())print(li.find('div', class_='p-name').text.strip())print(li.find('div', class_='p-shop').text.strip())print('http:'+li.find('div', class_='p-img').a.img.attrs['src'])

这些事通过bs4,来获取需要的数据

driver.find_elements_by_xpath('//*[@id="J_bottomPage"]/span[1]/a')[-1].click()
driver.find_elements_by_xpath('//*[@id="J_bottomPage"]/span[1]/a')[-1].send_keys(Keys.RETURN)

以上两种选择其中一个来实现跳转页功能,外面还有一个循环来实现页数的控制,第一个直接通过点击,第二个是通过模拟键盘的右方向键。

4.效果图

在这里插入图片描述

在这里插入图片描述