Python 爬虫实战 — 抓取京东商品数据!

大家好,我是 zeroing~

今天介绍一下如何用 Python 来爬取京东商品类目,数据包含商品标题、价格、出版社、作者等信息,

image-20210130103122096

本次爬虫用到的核心库为 Selenium + pyquery ,Selenium 用于驱动浏览器对网页进行模拟访问,pyquery 用于解析页面信息做数据提取,先看一下最终效果

method1

启动脚本之后,Selenium 自动打开页面京东网页端页面,对商品页信息进行翻页操作,在浏览器翻页的同时,控制后台返回提取到的数据,

在介绍主程序之前,这里先介绍 Selenium 程序包

Selenium 的安装

Selenium 主要作为 Web 应用程序的测试工具,能够操控浏览器完成一系列步骤,模拟人为操作;比如自动刷课自动填写文本网页端自动查询快递单号 都是没问题的,目前支持 Java、Python、C#、Ruby 等多种语言;

image-20210130110859702

在做网页爬取时,有的网页的数据是以 Ajax 方式进行渲染,如微博,头条没有下一页入口通过刷新页面实现翻页效果;这类网页端数据并不是直接放在 html 中,是通过用户操作触发镶嵌在html 中的 js 命令,从而调用存放 json 文件中的数据,最终呈现;

对于这类网页采集时,一般有两种思路:

  • 1,利用开发者工具,找到存放 json 数据隐藏链接,再用常规的 Request 方法对数据进行提取;

  • 2,利用 Selenium 工具模拟人为操作,实现数据的抓取;

因此 Selenium 工具可以对于网页端的一些反爬措施能够达到一些有效的抑制;

Python 使用 Selenium 时可以借助封装好的 Selenium 库,安装时利用 pip 命令即可完成

pip install selenium

目前 Selenium 支持的浏览器包括 Chrome 和 Firefox ,这里建议大家选择 Chrome 会好一点,因为网上关于 Chrome 的文档相对会多一点,

但在使用之前,除了保证 Chrome 浏览器安装好之外,还需要确保 chromedriver.exe 工具( Selenium 的核心为 webdriver,而 chromedriver.exe 为 Chrome 的 WebDriver 工具)也安装好

chromedriver 的版本需要与 Chrome 浏览器的版本对应,下载到本地即可

image-20210130114828711

下载地址如下:https://chromedriver.chromium.org/downloads

2,爬虫逻辑

用 Selenium 模拟人为操作对京东数据进行抓取,紧要依次进行以下几个步骤(这里以抓取 Python书籍 商品为例):

  • 1,驱动浏览器,打开京东网站;

  • 2,找到搜素框,清空并填入关键词Python书籍,再点击一下旁边的搜索按钮;

  • 3,转到商品页对数据进行抓取,再驱动 Selenium 工具完成翻页操作,依次对全部数据进行抓取;

image-20210201165949016

首先需要进行初始化,创建 webdriver 的 Chrome浏览器、数据的存储文件(这里我用的是 txt 文件)

def __init__(self,item_name,txt_path):
        url = 'https://www.jd.com/' # 登录网址
        self.url = url
        self.item_name = item_name

        self.txt_file = open(txt_path,encoding='utf-8',mode='w+')

        options = webdriver.ChromeOptions() # 谷歌选项

        # 设置为开发者模式,避免被识别
        options.add_experimental_option('excludeSwitches',
                                        ['enable-automation'])
        self.browser  = webdriver.Chrome(executable_path= "C:/Program Files/Google/Chrome/Application/chromedriver.exe",
                                         options = options)
        self.wait   =  WebDriverWait(self.browser,2)

webdriver.Chrome() 方法用于创建一个驱动的浏览器 Chrome ,将之前下载到本地的 chromedriver.exe 文件夹路径赋给 executable_path 参数

在浏览器打开网页时,可能由于网速出现加载慢的问题,因此这里用 WebDriverWait 方法来创建一个 wait 方法,每次调用时浏览器都需要等待 2 秒之后再进行下一步操作;

初始化操作之后,接下来就是主程序进行模拟访问、输入、点击等操作;我把这部分操作全部封装到一个 run() 函数中,

def run(self):
        """登陆接口"""
        self.browser.get(self.url)
        
        input_edit = self.browser.find_element(By.CSS_SELECTOR,'#key')
        input_edit.clear()
        input_edit.send_keys(self.item_name)


        search_button = self.browser.find_element(By.CSS_SELECTOR,'#search > div > div.form > button')
        search_button.click()# 点击
        time.sleep(2)

        html = self.browser.page_source # 获取 html
        self.parse_html(html)
        current_url = self.browser.current_url # 获取当前页面 url
        initial_url = str(current_url).split('&pvid')[0]

        for i in range(1,100):
            try:
                print('正在解析----------------{}图片'.format(str(i)))
                next_page_url = initial_url + '&page={}&s={}&click=0'.format(str(i*2+1),str(i*60+1))
                print(next_page_url)
                self.browser.get(next_page_url)

                self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_goodsList > ul > li')))
                html = self.browser.page_source
                self.parse_html(html)# 对 html 网址进行解析
                time.sleep(2) # 设置频率
            except Exception as e:
                print('Error Next page',e)
                self.txt_file.close()# 关闭 txt 文件

首先用 get() 方法访问京东主页面,再定位到页面中的搜索栏和搜索按钮标签 input_editsearch_button ;完成输入,点击操作

关于网页元素标签定位,如果不会的话可借助于浏览器开发者模式,分为下面几步(这里以 CSS_Selector 为例):

  • 1,点击开发者模式中左上角拾取元素按钮;

  • 2,用鼠标点击你要选择的元素;

  • 3,在 html 源码选中区域,鼠标右键选择 Copy

  • 4,选中 Copy Selector 选项;

  • 5,粘贴到粘贴板上即可;

image-20210130143737925

在进行翻页操作时,这里根据 京东 url 规律来进行构造的,

第 5 页

https://search.jd.com/Search?keyword=%E4%BB%A3%E6%A3%AE%E9%93%B5&qrst=1&suggest=7.def.0.base&wq=%E4%BB%A3%E6%A3%AE%E9%93%B5&stock=1&page=9&s=241&click=0

第 6 页

https://search.jd.com/Search?keyword=%E4%BB%A3%E6%A3%AE%E9%93%B5&qrst=1&suggest=7.def.0.base&wq=%E4%BB%A3%E6%A3%AE%E9%93%B5&stock=1&page=11&s=301&click=0

仔细查看的话会发现,这里第 5 页和第 6 页 url 唯一不同的就是其中两个参数 pages

  • page 之间相差2;

  • s 之间相差 60;

根据这个规律,通过更改 page 和 s 参数来构建京东商品前100 页商品信息,来完成数据的抓取;

关于数据提取部分,我利用 parse_html 函数来完成

image-20210130145641321

为了提高程序的友好性,我把全部功能封装到一个类中,使用者只需要输入两个参数,一个是用于需要采集的商品名称,另一个是存储文件路径;即可完成数据的爬取;

image-20210130150016819

最终把爬取到的数据存入 txt 文件中,结果如下

image-20210201170225432

4,总结

尽管 selenium 对于网页端的一些反爬机制实现有效地破解,但对于一些网站时没有用的,例如拉勾网,当你用 Selenium 驱动浏览器在拉钩官网模拟翻页操作时,网站能识别出非人为操作,对你的 IP 进行暂时性封禁并警告;

关于本篇文章涉及到的完整源码,关注微信公号:小张Python,后台回复关键字:京东商品 ,即可获取!

好了,以上就是本篇文章的全部内容了,最后感谢大家的阅读!

你可能感兴趣的:(Python 爬虫实战 — 抓取京东商品数据!)