Python网络爬虫(Xpath解析, lxml库, selenium)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: python、python爬虫、网络爬虫、爬虫框架、selenium、requests、urllib、数据分析、大数据、爬虫爬取静态网页、爬虫基础

安装:
  Windows :安装selenium
      python -m pip install selenium
  Anaconda Prompt下执行 : 
      conda install selenium
Linux/Mac OS:
      sudo pip3 install selenium

  Ubuntu :安装Scrapy框架
    #### 依赖库较多,以下为全部依赖库,有些已安装 ####
    sudo apt-get install libssl-dev
       sudo apt-get install libffi-dev 
       sudo apt-get install python3-dev
       sudo apt-get install build-essential
       sudo apt-get install libxml2
       sudo apt-get install libxml2-dev
       sudo apt-get install libxslt1-dev
       sudo apt-get install zlib1g-dev
    sudo pip3 install Scrapy


xpath工具(解析)
  xpath
    在XML文档中查找信息的语言,同样适用于HTML文档的检索
  xpath辅助工具
    Chrome插件 :XPath Helper
      打开 :Ctrl + Shift + X
      关闭 :Ctrl + Shift + X
    Firefox插件 :XPath checker
    XPath表达式编辑工具 :XML quire
  xpath匹配规则
    匹配演示
      查找bookstore下所有节点:/bookstore
      查找所有的book节点://book
      查找所有book下的title节点中,lang属性为"en"的节点
        //book/title[@lang="en"]
      查找bookstore下的第2个book节点下的title节点:
        /bookstore/book[2]/title/text()
    选取节点
      /  : 从根节点开始选取 
      // : 从整个文档中查找节点
           //price  、  /bookstore/book//price
      @  : 选取某个节点的属性
           //title[@lang="en"]
     @的使用
      选取1个节点 : //title[@lang="en"]
      选取N个节点 : //title[@lang]
      选取节点的属性值 : //title/@lang
<a class=....,src="http://..."
    匹配多路径
      符号 : |
      获取所有book节点下的 title节点和price节点
        //book/title | //book/price
    函数
      contains() : 匹配一个属性值中包含某些字符串的节点
      //title[contains(@lang,"e")]
      text() 
        //title[contains(@lang,"e")]/text()

lxml库及xpath使用
  lxml库 :HTML/XML解析库
    安装 

      python -m pip install lxml
      conda install lxml

    使用流程
      导模块
        from lxml import etree
      利用lxml库的etree模块创建解析对象
        parseHtml = etree.HTML(html)
      解析对象调用xpath工具定位节点信息
        r_list = parseHtml.xpath('xpath表达式')
### 只要调用了xpath,结果一定是列表 ###
# 构造解析对象
parseHtml = etree.HTML(html)
# 利用解析对象调用xpath匹配
r1 = parseHtml.xpath('//a/@href')
print(r1)

# 获取 /
r2 = parseHtml.xpath('//a[@id="channel"]/@href')
print(r2)

# 获取非 /
r3 = parseHtml.xpath('//ul[@id="nav"]//a/@href')
print(r3)
# 获取所有 a 节点的文本内容
r4 = parseHtml.xpath('//a/text()')
print(r4)
# 获取 图片、军事 ... 
r5 = parseHtml.xpath('//ul[@id="nav"]//a')
for i in r5:
    print(i.text)


    如何获取节点对象的内容
      节点对象.text
抓取百度贴吧帖子里面所有的图片
      目标 :抓取指定贴吧所有图片
      思路
        获取贴吧主页URL,下一页:找URL规律
获取1页中每个帖子的URL
对每个帖子URL发请求,获取帖子里图片URL
对图片URL发请求,以wb方式写入本地文件
      步骤
        获取贴吧主页URL
  http://tieba.baidu.com/f? + 查询参数
找到页面中所有帖子的URL

  src : 完整链接
  href : 和主URL进行拼接
    /p/5926064184
            http://tieba.baidu.com/p/5926064184
  xpath匹配链接:
   写法1: //div[@class="col2_right j_threadlist_li_right"]/div/div/a/@href

           写法2(推荐): //div[@class="t_con cleafix"]/div/div/div/a/@href
找每个帖子中图片URL
  Xpath匹配:
    //img[@class="BDE_Image"]/@src

'''02_百度贴吧图片抓取案例.py'''
import requests
from lxml import etree
import time

class BaiduImageSpider:
    def __init__(self):
        self.headers = {"User-Agent":"Mozilla/5.0"}
        self.baseurl = "http://tieba.baidu.com"
        self.pageurl = "http://tieba.baidu.com/f?"
        
    # 获取所有帖子URL列表
    def getPageUrl(self,params):
        res = requests.get(self.pageurl,params=params,headers=self.headers) 
        res.encoding = "utf-8"
        html = res.text
        # 构建解析对象
        parseHtml = etree.HTML(html)
        # 帖子链接列表
        t_list = parseHtml.xpath('//div[@class="t_con cleafix"]/div/div/div/a/@href')
        # t_list : ['/p/233432','/p/2039820',..]
        print(t_list)
        for t_link in t_list:
            # 拼接帖子完整链接
            t_link = self.baseurl + t_link
            self.getImageUrl(t_link)
    
    # 获取帖子中图片URL列表
    def getImageUrl(self,t_link):
        res = requests.get(t_link,headers=self.headers)
        res.encoding = "utf-8"
        html = res.text
        # 构造解析对象
        parseHtml = etree.HTML(html)
        img_list = parseHtml.xpath('//img[@class="BDE_Image"]/@src')
        print(img_list)
        for img_link in img_list:
            self.writeImage(img_link)
    
    # 保存到本地
    def writeImage(self,img_link):
        # 获取图片的bytes
        res = requests.get(img_link,headers=self.headers)
        res.encoding = "utf-8"
        html = res.content
        # filename
        filename = img_link[-12:]
        with open(filename,"wb") as f:
            f.write(html)
            time.sleep(0.5)
            print("%s下载成功" % filename)
    
    # 主函数
    def workOn(self):
        name = input("请输入贴吧名:")
        begin = int(input("请输入起始页:"))
        end = int(input("请输入终止页:"))
        
        for n in range(begin,end+1):
            pn = (n-1)*50
            params = {
                    "kw":name,
                    "pn":str(pn)
                }
            self.getPageUrl(params)
            
if __name__ == "__main__":
    spider = BaiduImageSpider()
    spider.workOn()

糗事百科-xpath
      目标 :用户昵称、段子内容、好笑数、评论数
      步骤
        找URL
  https://www.qiushibaike.com/8hr/page/1/
xpath匹配
  基准xpath://div[contains(@id,"qiushi_tag_")]

    用户昵称: ./div/a/h2
    段子内容: .//div[@class="content"]/span
    好笑数量: .//i
    评论数量: .//i
动态网站数据抓取
  Ajax动态加载
    特点 :滚动鼠标混轮时加载
    抓包工具 :查询参数在 WebForms -> QueryString


'''03_糗事百科案例.py'''
import requests
from lxml import etree
import pymongo

class QiuShiSpider:
    def __init__(self):
        self.url = "https://www.qiushibaike.com/8hr/page/1/"
        self.headers = {"User-Agent":"Mozilla/5.0"}
        self.conn = pymongo.MongoClient("localhost",27017)
        self.db = self.conn.Baikedb
        self.myset = self.db.baikeset
        
    def getPage(self):
        res = requests.get(self.url,headers=self.headers)
        res.encoding = "utf-8"
        html = res.text
        self.parsePage(html)
    
    def parsePage(self,html):
        parseHtml = etree.HTML(html)
        # 基准xpath,每个段子的列表
        base_list = parseHtml.xpath('//div[contains(@id,"qiushi_tag_")]')
        # 遍历每个段子的节点对象(base)
        for base in base_list:
            # 用户昵称
            username = base.xpath('./div/a/h2')
            if len(username) == 0:
                username = "匿名用户"
            else:
                username = username[0].text
            # 段子内容
            content = base.xpath('.//div[@class="content"]/span')[0].text
            # 好笑数量
            # [<element.好笑数量>,<eleme.评论>,<element...>]
            laughNum = base.xpath('.//i')[0].text 
            # 评论数量
            pingNum = base.xpath('.//i')[1].text
            
            d = {
                  "username":username.strip(),
                  "content":content.strip(),
                  "laughNum":laughNum.strip(),
                  "pingNum":pingNum.strip()
              }
            self.myset.insert(d)
            print("存入数据库成功")


if __name__ == "__main__":
    spider = QiuShiSpider()
    spider.getPage()















相关文章
|
2月前
|
JavaScript 前端开发 API
网络请求库 – axios库
网络请求库 – axios库
192 60
|
1月前
|
SQL Oracle 关系型数据库
SQL整库导出语录:全面解析与高效执行策略
在数据库管理和维护过程中,整库导出是一项常见的需求,无论是为了备份、迁移还是数据分析,掌握如何高效、准确地导出整个数据库至关重要
|
1月前
|
数据采集 XML 数据格式
Python爬虫--xpath
Python爬虫--xpath
|
1月前
|
测试技术 数据安全/隐私保护 开发者
自动化测试的奥秘:如何用Selenium和Python提升软件质量
【9月更文挑战第35天】在软件开发的海洋中,自动化测试是那艘能引领我们穿越波涛的帆船。本文将揭开自动化测试的神秘面纱,以Selenium和Python为工具,展示如何构建一个简单而强大的自动化测试框架。我们将从基础出发,逐步深入到高级应用,让读者能够理解并实现自动化测试脚本,从而提升软件的质量与可靠性。
|
2月前
|
XML JSON 网络协议
超级好用的C++实用库之字节流解析器
超级好用的C++实用库之字节流解析器
28 3
|
2月前
|
Web App开发 测试技术 持续交付
自动化测试的利器:Selenium与Python的完美结合
【9月更文挑战第21天】在软件开发的世界里,测试是确保产品质量的关键步骤。随着敏捷开发和持续集成的流行,自动化测试工具变得尤为重要。本文将介绍如何使用Selenium和Python进行高效的自动化测试,不仅提供代码示例,还深入探讨如何设计测试用例、选择正确的测试框架、以及如何整合到CI/CD流程中。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。
45 3
|
2月前
|
数据采集 JSON API
🎓Python网络请求新手指南:requests库带你轻松玩转HTTP协议
本文介绍Python网络编程中不可或缺的HTTP协议基础,并以requests库为例,详细讲解如何执行GET与POST请求、处理响应及自定义请求头等操作。通过简洁易懂的代码示例,帮助初学者快速掌握网络爬虫与API开发所需的关键技能。无论是安装配置还是会话管理,requests库均提供了强大而直观的接口,助力读者轻松应对各类网络编程任务。
115 3
|
2月前
|
机器学习/深度学习 JSON API
HTTP协议实战演练场:Python requests库助你成为网络数据抓取大师
在数据驱动的时代,网络数据抓取对于数据分析、机器学习等至关重要。HTTP协议作为互联网通信的基石,其重要性不言而喻。Python的`requests`库凭借简洁的API和强大的功能,成为网络数据抓取的利器。本文将通过实战演练展示如何使用`requests`库进行数据抓取,包括发送GET/POST请求、处理JSON响应及添加自定义请求头等。首先,请确保已安装`requests`库,可通过`pip install requests`进行安装。接下来,我们将逐一介绍如何利用`requests`库探索网络世界,助你成为数据抓取大师。在实践过程中,务必遵守相关法律法规和网站使用条款,做到技术与道德并重。
49 2
|
2月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
67 3
|
2月前
|
网络协议 Linux C++
超级好用的C++实用库之网络
超级好用的C++实用库之网络
44 0

推荐镜像

更多