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

优采云 发布时间: 2022-06-02 20:08

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

  大家好,我是 zeroing~

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

  

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

  

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

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

  1,Selenium 的安装

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

  

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

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

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

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

  pip install selenium <br />

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

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

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

  

  下载地址如下:

  2,爬虫逻辑

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

  

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

  def __init__(self,item_name,txt_path):<br />        url = 'https://www.jd.com/' # 登录网址<br />        self.url = url<br />        self.item_name = item_name<br /><br />        self.txt_file = open(txt_path,encoding='utf-8',mode='w+')<br /><br />        options = webdriver.ChromeOptions() # 谷歌选项<br /><br />        # 设置为开发者模式,避免被识别<br />        options.add_experimental_option('excludeSwitches',<br />                                        ['enable-automation'])<br />        self.browser  = webdriver.Chrome(executable_path= "C:/Program Files/Google/Chrome/Application/chromedriver.exe",<br />                                         options = options)<br />        self.wait   =  WebDriverWait(self.browser,2)<br />

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

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

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

   def run(self):<br />        """登陆接口"""<br />        self.browser.get(self.url)<br />        <br />        input_edit = self.browser.find_element(By.CSS_SELECTOR,'#key')<br />        input_edit.clear()<br />        input_edit.send_keys(self.item_name)<br /><br /><br />        search_button = self.browser.find_element(By.CSS_SELECTOR,'#search > div > div.form > button')<br />        search_button.click()# 点击<br />        time.sleep(2)<br /><br />        html = self.browser.page_source # 获取 html<br />        self.parse_html(html)<br />        current_url = self.browser.current_url # 获取当前页面 url<br />        initial_url = str(current_url).split('&pvid')[0]<br /><br />        for i in range(1,100):<br />            try:<br />                print('正在解析----------------{}图片'.format(str(i)))<br />                next_page_url = initial_url + '&page={}&s={}&click=0'.format(str(i*2+1),str(i*60+1))<br />                print(next_page_url)<br />                self.browser.get(next_page_url)<br /><br />                self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_goodsList > ul > li')))<br />                html = self.browser.page_source<br />                self.parse_html(html)# 对 html 网址进行解析<br />                time.sleep(2) # 设置频率<br />            except Exception as e:<br />                print('Error Next page',e)<br />                self.txt_file.close()# 关闭 txt 文件<br />

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

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

  

  在进行翻页操作时,这里根据 京东 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<br />

  第 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<br />

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

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

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

  

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

  

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

  

  3,总结

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

  关于本篇文章涉及到的完整源码,在后台回复关键字:京东商品 ,即可获取!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线