在学会了抓包,接口请求(如requests库)和Selenium的一些操作方法后,基本上就可以编写爬虫,爬取绝大多数网站的内容。

在爬虫领域,Selenium永远是最后一道防线。从本质上来说,访问网页实际上就是一个接口请求。请求url后,返回的是网页的源代码。

我们只需要解析html或者通过正则匹配提取出我们需要的数据即可。

有些网站我们可以使用requests.get(url),得到的响应文本中获取到所有的数据。而有些网页数据是通过JS动态加载到页面中的。使用requests获取不到或者只能获取到一部分数据。

此时我们就可以使用selenium打开页面来,使用driver.page_source来获取JS执行完后的完整源代码。

例如,我们要爬取,diro官网女包的名称,价格,url,图片等数据,可以使用requests先获取到网页源代码:

访问网页,打开开发者工具,我们可以看到所有的商品都在一个

  • 标签里,展开这个li标签,我们可找到商品名称,价格,url,图片链接等信息

    从html格式的源码中提取数据,有多种选择,可以使用xml.etree等等方式,bs4是一个比较方便易用的html解析库,配合lxml解析速度比较快。

    bs4的使用方法为

    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(网页源代码字符串,'lxml')
    
    soup.find(...).find(...)
    soup.findall()
    soup.select('css selector语法')

    soup.find()可以通过节点属性进行查找,如,soup.find('div', id='节点id')soup.find('li', class_='某个类名')soup.find('标签名', 属性=属性值),当找到一个节点后,还可以使用这个节点继续在其子节点中查找。

    soup.find_all()是查找多个,同样属性的节点,返回一个列表。

    soup.select()是使用css selector语法查找,返回一个列表。

    以下为示例代码:

    from selenium import webdriver
    from bs4 import BeautifulSoup driver = webdriver.Chrome()
    driver.get('https://www.dior.cn/zh_cn/女士精品/皮具系列/所有手提包')
    soup = BeautifulSoup(driver.page_source, 'lxml') products = soup.select('li.is-product')
    for product in products:
    name = product.find('span', class_='product-title').text.strip()
    price = product.find('span', class_='price-line').text.replace('¥', '').replace(',','')
    url = 'https://www.dior.cn' + product.find('a', class_='product-link').attrs['href']
    img = product.find('img').attrs['src']
    sku = img.split('/')[-1]
    print(name, sku, price) driver.quit()

    运行结果,如下图:

    注:本例中,也可以使用requests.get()获取网页源代码,格式和使用selenium加载的稍有不同。

    一般简单爬虫编写的步骤为:

    1. 进入列表页,打开开发者工具,刷新页面及向下滚动,查看新产品加载,是否能抓到XHR数据接口(直接返回JSON格式所有产品数据的接口)
    2. 如果有这种接口,尝试修改参数中的分页值,和请求总数值,看看是否能从一个接口返回所有的商品数据
    3. 如果只有Doc类型的接口返回页面,尝试使用requests.get()请求页面,分析响应文本,是否包含所有商品数据
    4. 如果requests获取不到商品数据或数据不全可以使用selenium加载页面,然后使用bs4解析提取,如果有多个页面,循环逐个操作即可。

    Selenium结合BeautifulSoup4编写简单爬虫的更多相关文章

    1. 用python编写简单爬虫

      需求:抓取百度百科python词条相关词条网页的标题和简介,并将数据输出在一个html表格中 入口页:python的百度词条页 https://baike.baidu.com/item/Python/ ...

    2. Python 利用Python编写简单网络爬虫实例3

      利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.51testing. ...

    3. Python 利用Python编写简单网络爬虫实例2

      利用Python编写简单网络爬虫实例2 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://www.51testing. ...

    4. 在python3中使用urllib.request编写简单的网络爬虫

      转自:http://www.cnblogs.com/ArsenalfanInECNU/p/4780883.html Python官方提供了用于编写网络爬虫的包 urllib.request, 我们主要 ...

    5. Python开发简单爬虫

      简单爬虫框架: 爬虫调度器 -> URL管理器 -> 网页下载器(urllib2) -> 网页解析器(BeautifulSoup) -> 价值数据 Demo1: # codin ...

    6. python3实现简单爬虫功能

      本文参考虫师python2实现简单爬虫功能,并增加自己的感悟. #coding=utf-8 import re import urllib.request def getHtml(url): page ...

    7. Python开发简单爬虫 - 慕课网

      课程链接:Python开发简单爬虫 环境搭建: Eclipse+PyDev配置搭建Python开发环境 Python入门基础教程 用Eclipse编写Python程序   课程目录 第1章 课程介绍 ...

    8. Python开发简单爬虫(一)

      一 .简单爬虫架构: 爬虫调度端:启动爬虫,停止爬虫,监视爬虫运行情况 URL管理器:对将要爬取的和已经爬取过的URL进行管理:可取出带爬取的URL,将其传送给“网页下载器” 网页下载器:将URL指定 ...

    9. 用python语言编写网络爬虫

      本文主要用到python3自带的urllib模块编写轻量级的简单爬虫.至于怎么定位一个网页中具体元素的url可自行百度火狐浏览器的firebug插件或者谷歌浏览器的自带方法. 1.访问一个网址 re= ...

    随机推荐

    1. (七)发送、接收SOAP消息(以HttpClient方式)(2)

      一.为什么要用soap 原本我们使用web服务都是根据wsdl生成客户端(生成一堆java文件)然后再调用,本章节讲解如何用soap消息来替代这种方式. 二.SOAP消息格式 SOAP(简单对象访问协 ...

    2. GDB数据库SQL操作平台

      GDB数据库SQL操作平台 开发本软件的初衷:由于计算数据库要素层属性的时候,涉及到要计算多个字段,或者要根据代码计算名称,得一个一个的筛选并计算,过程比较繁琐,于是就想能不能通过像处理SQLServ ...

    3. Asp.Net Core 轻松学系列-2从安装环境开始

      Asp.Net Core 介绍     Asp.Net Core是微软新一代的跨平台开发框架,基于 C# 语言进行开发,该框架的推出,意味着微软从系统层面正式进击 Linux 服务器平台:从更新速度开 ...

    4. 案例-使用MapReduce实现join操作

      哈喽-各位小伙伴们中秋快乐,好久没更新新的文章啦,今天分享如何使用mapreduce进行join操作. 在离线计算中,我们常常不只是会对单一一个文件进行操作,进行需要进行两个或多个文件关联出更多数据, ...

    5. docker系列七之Dockerfile

      Dockerfile 一. Dockerfile是什么   Dockerfile是docker中镜像文件的的描述文件,说的直白点就是镜像文件到底是由什么东西一步步构成的.例如我们在淘宝上买了一件商品, ...

    6. Vue命名路由

      Vue命名路由 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

    7. ztree在onCheck()方法中防止因触发联动关系导致页面多次渲染而卡死的问题

      这几天在项目中遇到了要使用树形选择框, 而且要求比较复杂,具体叙述如下: 首先是有个选择框,左边选择是适用的商品,右边显示已经选择的商品.也就是说,左边每次勾选操作,都要触发一个事件去刷新右边的页面, ...

    8. redis缓存击穿和缓存雪崩

      工作中经常会用到redis来做缓存,以防止后台db挂掉.但是db数据一般都在10T以上,不可能把mysql中的数据全部放入redis中,所以一般是将一些热key放入redis中. 缓存击穿 一个请求先 ...

    9. Linux行编辑器——ed

      实验文件test.txt内容 root:x:::root:/root:/bin/bash bin:x:::bin:/bin:/sbin/nologin daemon:x:::daemon:/sbin: ...

    10. Nginx,Haproxy/lvs负载均衡的优缺点分析

      PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不 ...