第四天:

XPATH和LXML类库

为什么要学习XPATH和LXML类库

      lxml是一款高性能的 Python HTML/XML 解析器,我们可以利用XPath,来快速的定位特定元素以及获取节点信息

 

什么是XPATH:

      XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,

可用来在 HTML\XML 文档中对元素和属性进行遍历。

 

XPATH节点选择

常用节点选择工具:

  • Chrome插件 XPath Helper
  • 开源的XPath表达式编辑工具:XMLQuire(XML格式文件可用)
  • Firefox插件 XPath Checker

在chrome中安装xpath

在chrome浏览器中访问:chrome://extensions/

启动开发者模式(开关按钮推到右边)

把xpath插件xpath_helper_2_0_2.crx拖动到Chrome中即可

 

 

xpath语法

首先,需要安装python的lxml插件(LXML)

pip install lxml

 

x:xml

path:路径

两者结合表示使用路径的方式去查找xml的内容

 

l:lib

xml:xml格式

安装完lxml库,可以在python中识别xml

以贴吧为例:https://tieba.baidu.com/f?kw=%E8%9C%A1%E7%AC%94%E5%B0%8F%E6%96%B0&pn=0

 

1 查找标签

全文查找(以//开头)

//div

//span

//a

 

2 子路径查找(在父目录下找子目录)

//div/span

//div/a

//li/div/div/div/div/a

//li//a

//li/div//a

 

 

3 查找属性

如下格式查找属性

标签名[@属性名=属性值]

比如:

//a[@class="j_th_tit"]

//div[@class="t_con cleafix"]

//div[@class="threadlist_lz clearfix"]//a[@class="j_th_tit"]

注意:这里获取的是标签对象,不是内容

 

4 读取属性

如下格式读取属性

标签名/@属性名

比如:

//a[@class="j_th_tit"]/@href

//div[@class="threadlist_lz clearfix"]//a[@class="j_th_tit"]/@href

 

5 获取内容

通过text()获取文本的内容

标签名/text()

比如:

//a[@class="j_th_tit"]/text()

//div[@class="threadlist_lz clearfix"]//a[@class="j_th_tit"]/text()

注意:这里获取的才是真正的内容,字符串。

 

 

练习:用xpath爬取糗事百科的题目和作者。

代码见test4-qiushispider.pt

import requests
from lxml import etree
import json

class Qiushispider:
    def __init__(self):
        self.url_temp = "https://www.qiushibaike.com/8hr/page/{}/"
       
self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"}

    def get_url_list(self):
        # 把页码传进去
       
return [self.url_temp.format(i) for i in range(1,2)]

    def parse_url(self, url):# 2.遍历,发送请求,获取响应
       
response = requests.get(url, headers=self.headers)
        return response.content.decode()

    def get_content_list(self, html_str):# 3.提取数据
       
html = etree.HTML(html_str)
        li_list = html.xpath('//div[@class="recommend-article"]/ul/li') #分组
       
content_list = []
        for li in li_list:
            item = {}
            item["title"] = li.xpath(".//div/a/text()")# 提取标题
            
item["author"] = li.xpath(".//div/a/span/text()")# 提取作者
           
content_list.append(item)
        return content_list

    def save_content_list(self, content_list):# 4.保存
       
with open("qiushi.txt", "a") as f:
            for content in content_list:
                f.write(json.dumps(content, ensure_ascii=False, indent=2))

    def run(self):
        # 1.url_start
       
url_list = self.get_url_list()
        # 2.遍历,发送请求,获取响应
       
for url in url_list:
            html_str = self.parse_url(url)
            # 3.提取数据
           
content_list = self.get_content_list(html_str)
            # 4.保存
           
self.save_content_list(content_list)

if __name__ == "__main__":
    qiushi = Qiushispider()
    qiushi.run()

 

 

 

 

 

实现爬虫的总结:

  1. 准备url

-准备start_ulr

-如果url地址规律不明显,总数不确定,通过代码提取下一页。

- xpath

-寻找url地址,部分参数在当前的响应中

-准备url_list

-页码总数明确

-url地址规律明显

2.发送请求,获取响应

-添加随机的User-Agent,反反爬虫

-添加随机的代理ip,反反爬虫

-在对方判断我们是爬虫之后应该添加更多的headers字段,包括cookie

-cookie的处理可以使用session来解决

-准备一堆能用的cookie,组成cookie池

-如果不登录(不是post请求)

-准备刚开始能够成功请求对方网站的cookie,即接收对方网站设置在response的cookie

-下一次请求的时候,使用之前的列表中的cooKie来请求

-如果登录

      -准备多个账号

      -使用程序获取每个账号的cookie

      -最后请求登录之后才能访问的网站随机的选择cookie

 

3.提取数据

-确定数据的位置

-如果数据在当前url地址中

       直接提取

-如果数据不在当前的url地址中

-在其他的响应中,寻找数据的位置

             1.从network中从上往下找

            2.排除法(排除js,图片等)

-数据提取方法

       1.xpath,从HTML中提取整块的数据。

       2.json

       3.re

 

4.保存

-保存在本地(text)

-保存在数据库