使用python+selenium爬取京东商品列表

1、直接从JavaScript中采集加载的数据

import requests
import urllib.parse
from lxml import etree

header={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36'
}
def getList(url):
    req = requests.get(url, headers=header)
    req.encoding="utf-8"
    html = etree.HTML(source)
    xpath = html.xpath('//ul[@class="gl-warp clearfix"]/li')
    for i in xpath:
        a=i.xpath("div/div[4]/a/em/text()")
        b=i.xpath("div/div[3]/strong/i/text()")
        


if __name__ == '__main__':
    label = "手机"
    label = urllib.parse.quote(label)
    url = "https://search.jd.com/Search?keyword={}&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq={}&cid2=653&cid3=655&page={}&s=110&click=0"
    num = 0
    for index in range(1, 3, 2):
        u = url.format(label, label, index)
        getList(u)

这样就可以爬取到手机的价格和型号了 但是有个问题 因为京东是动态加载 所以使用python爬取的话 只能爬取到前30个 之后动态加载的就没有办法了  要想解决 就需要引入一个新的东西selenium

 

2、引入selenium解决动态加载数据无法爬取的问题

2.1.Selenium简介

Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。

2.2.支持多种操作系统

如Windows、Linux、IOS、Android等。

2.3.安装Selenium

pip install Selenium

2.4.安装浏览器驱动

Selenium3.x调用浏览器必须有一个webdriver驱动文件

  1. Chrome驱动文件下载:点击下载chromedrive
  2. Firefox驱动文件下载:点解下载geckodriver

 

3.使用Selenium

3.1.第一步是引入

from selenium import webdriver

3.2.第二步是使用 

#打开chrome 这里可以选择其他的浏览器 例如:Firefox等
driver=webdriver.Chrome()
#需要打开的url
driver.get(url)
# 执行页面向下滑至底部的动作
driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")

但是这个时候,可能会报一个错误,这个错误就是因为没有下载或配置驱动:

selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH. 

遇到这个错误不要慌,我能搞定,这个时候,就把之前下载的Chrome或者Firefox驱动文件放到你python安装目录的Scripts下面就可以了

温馨小贴士:在使用Selenium的时间,记得让它休息一下(time.sleep(2)),不然有可能代码没有全部加载,就结束了偶

但是有个问题,我页面加载完成了,可是我使用requests.get获取的html和它好像没毛线关系啊,这个时候就需要一个方法了:

source = driver.page_source

这个source就等同于 requests.get(url, headers=header)返回的参数了

 

4.最后了,贴下完整版源码

import requests
import urllib.parse
from lxml import etree
from selenium import webdriver
import time

header={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36'
}
def getList(url):
    driver=webdriver.Firefox()
    driver.get(url)
    driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
    #  停顿5秒等待页面加载完毕!!!(必须留有页面加载的时间,否则获得的源代码会不完整。)
    time.sleep(2)
    source = driver.page_source
    # print(source)
    # req = requests.get(url, headers=header)
    # req.encoding="utf-8"
    html = etree.HTML(source)
    xpath = html.xpath('//ul[@class="gl-warp clearfix"]/li')
    for i in xpath:
        a=i.xpath("div/div[4]/a/em/text()")
        b=i.xpath("div/div[3]/strong/i/text()")
        print(a)


if __name__ == '__main__':
    label = "手机"
    label = urllib.parse.quote(label)
    url = "https://search.jd.com/Search?keyword={}&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq={}&cid2=653&cid3=655&page={}&s=110&click=0"
    num = 0
    for index in range(1, 3, 2):
        u = url.format(label, label, index)
        print(u)
        getList(u)

 

 

你可能感兴趣的:(使用python+selenium爬取京东商品列表)