python+selenium爬取京东商品数据

1.首先导入需要的类

下面再介绍这些类的使用方法

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By
import time
import csv

2.初始化Chrome浏览器,输入要爬取的网址

# 实例化Options
options = Options()
# 不加载图片
prefs = {"profile.managed_default_content_settings.images": 2}
options.add_experimental_option('prefs', prefs)
browser = webdriver.Chrome(executable_path='C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe',options=options)
url = 'https://www.jd.com/'
browser.get(url)
wait(browser, 5, 0.1).until(
    ec.presence_of_all_elements_located((By.ID, 'key'))
)
browser.find_element_by_id('key').send_keys('kindle')
wait(browser, 5, 0.1).until(
    ec.presence_of_all_elements_located((By.CSS_SELECTOR, ".form button.button"))
)
browser.find_element_by_css_selector(".form button.button").click()
time.sleep(3)

option = Options()
是用来实例化Options对象,从上面导入的类可以知道,options就是Chrome浏览器的一些配置。
prefs = {"profile.managed_default_content_settings.images": 2} options.add_experimental_option('prefs', prefs)
在爬取网站的时候不加载图片加快爬取的速度。
这里需要说明的是prefs = {"profile.managed_default_content_settings.images": 1}这个地方的值为1是加载图片。
browser = webdriver.Chrome(executable_path='C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe',options=options)
实例化webdriver,这里使用的是Chrome,我们还可以使用Firefox,第一个参数是启动器的地址,这里我们把启动器下载好了之后放在Chrome的安装目录下面
选择对应的Google Chrome Driver下载,地址:https://sites.google.com/a/chromium.org/chromedriver/downloads
选择对应的Firefox Driver下载,地址:
https://github.com/mozilla/geckodriver/releases
url = 'https://www.jd.com/' browser.get(url)
打开Chrome浏览器,输入京东的地址

wait(browser, 5, 0.1).until(
    ec.presence_of_all_elements_located((By.ID, 'key'))
)
browser.find_element_by_id('key').send_keys('kindle')
wait(browser, 5, 0.1).until(
    ec.presence_of_all_elements_located((By.CSS_SELECTOR, ".form button.button"))
)
browser.find_element_by_css_selector(".form button.button").click()
time.sleep(3)

wait(browser,5,0.1)
里面一共有三个参数,对应的是浏览器实例,一共等待的时间,刷新的时间
ec.presence_of_all_elements_located((By.ID, 'key'))
意思是id=‘key’的元素加载完成

3.爬取网页上商品信息

def parse_page(browser):
    # 执行js脚本,把进度条拉到最底部
    browser.execute_script(
        'window.scrollTo(0,document.body.scrollHeight)')
    # 加载网页的商品
    wait(browser, 5, 0.1).until(
        ec.presence_of_all_elements_located((By.CSS_SELECTOR, '.gl-item'))
    )
    li_list = browser.find_elements_by_xpath("//div[@id='J_goodsList']/ul/li[@class='gl-item']")
    for li in li_list:
        # 价格
        price = li.find_element_by_css_selector(".p-price i").text
        #  名字
        name = li.find_element_by_css_selector(".p-name em").text
        # 评论
        commit = li.find_element_by_css_selector(".p-commit strong").text
        product = [name, price, commit]
        with open('data/xxx.csv', 'a', encoding='utf-8') as f:
            writer = csv.writer(f)
            writer.writerow(product)

定义一个用于爬取一个页面上京东商品的函数

4.翻页爬取下一页商品信息

while True:
    parse_page(browser)
    # 判断是否应该点击下一页
    if browser.page_source.find('pn-next disabled') == -1:
        wait(browser,5,0.1).until(
            ec.presence_of_all_elements_located((By.XPATH,"//a[@class='pn-next']"))
        )
        # 下一页的按钮
        browser.find_element_by_xpath("//a[@class='pn-next']").click()
        time.sleep(2)
    else:
        break

思路是:判断这个页面上的“下一页”按钮是否可以点击,要是可以就点击跳转下一页

说明


结果用excel打开可以看到是乱码,原因是excel打开scv的默认编码是ANSI,我们保存的csv的编码是utf-8,这不会影响我们使用。

import pandas as pd

data = pd.read_csv('data/xxx.csv', index_col=False, header=0, names=['name', 'price', 'commit'])
print(data)

我们把它读取进来,如下图,可以正常显示

发布了25 篇原创文章 · 获赞 1 · 访问量 1641

猜你喜欢

转载自blog.csdn.net/weixin_43977647/article/details/104362833