Python爬虫

Stella981 等级 358 0 0

Python爬虫-xpath

  • Python爬虫-xpath
    • 说明
    • 再说明
    • 插件推荐
    • 语法讲述
    • 举栗子
    • 代码里使用
    • 实战句子迷
    • 需要的总结:

说明

关于Python爬虫请求数据方面的知识点基本讲完,但请求到数据之后呢?
当然是提取数据,抓出对我们有价值的内容是整个爬虫流程的关键步骤之一。现下流行方法有:xapth,BeautifulSoup,正则,PyQuery。如无意外,我会一一笔记下来。今天说说我的最爱吧。
——xpath

再说明

一般情况下,我们爬到的是整个静态网页页面,得到的是html源码,包含各种标签。但那些标签并非我们想要,如:
Python爬虫
我们只需要里边的文字,这种时候就可以xpath了。如上所说,类似的解决方法包括正则以及BeautifulSoup,前者难度较大,后者广受追捧。从解析速度上说,正则最快,xpath次之,BeautifulSoup再次之;从上手难度来说,BeautifulSoup最易,xpath次之,正则再次之。综合考虑,我偏爱xpath。也有人推崇PyQurey,认为比起繁琐的“美丽汤”语法,它短小精悍,而且如果使用者是前端工程师,掌握起来不需要耗费任何学习成本。这大概因为PyQurey的语法源于JQurey吧。

插件推荐

基于chrome浏览器的插件,它可以让我们提前看到提取效果,使用快捷键ctrl+shift+x
Python爬虫

语法讲述

只说常用的:
1. /从根节点开始
2. //从任意位置开始
可以这样理解两个的区别,前者从顶端开始,且前者的左右必须是紧邻的标签;后者任意位置开始,且左右间的标签允许存在间隔
3. div/p div标签下的p标签
4. 提取标签中某个属性的值 div/img/@某个属性
5. 确定带有a属性且值为b的div标签//div[@a="b"]
6. 如果需要取出标签中的文字//span/text()
7. 模糊查询 //div/a[contains(@某属性, "对应属性的部分值")]
8. 多个相同标签用索引方式定位,表示div下div下的第3个a标签 ://div/div/a[3]

举栗子

  1. 以腾讯社招为例
    Python爬虫
    可以发现tr的class值不同,而属性href只有数字部分不同,此时想要获取a标签中的字符串两种方法
    a) 模糊查询
    //tbody/tr/td/a[contains(@href, "position")]
    Python爬虫
    b) “|”或
    //tbody/tr[@class="even"]//a | //tbody/tr[@class="odd"]//a
    Python爬虫

代码里使用

from lxml import etree
# 实例化一个对象
selector = etree.HTML(response.text)
# 通过选择器进行筛选
result = selector.xpath("规则")

说明:返回的result是列表类型,如果没有提取到符合规则的信息会返回空列表

实战句子迷

页面呈现如下,要求:获取每个句子,以及“喜欢”量,以及“评论”数
Python爬虫

import requests
from lxml import etree
import json


url = "http://www.juzimi.com/search/node/%E5%82%B2%E6%85%A2%E4%B8%8E%E5%81%8F%E8%A7%81%20type%3Asentence"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
    "Referer": "http://www.juzimi.com/search/node/%E5%82%B2%E6%85%A2%E4%B8%8E%E5%81%8F%E8%A7%81%20type%3Asentence",
}

def get_html(params):
    """
    获取html页面
    """
    try:
        response = requests.get(url, params=params, headers=headers)
        response.raise_for_status()
        print(response.url)
        print(response.status_code)
    except :
        print("connection error")
        return None

    response.encoding = response.apparent_encoding
    return response.text

def parse_html(html):
    """
    处理html页面,提取需要数据
    """    
    data = {}
    selector = etree.HTML(html)
    # 构建xpath规则
    ruler = '//div[@class="view-content"]/div[contains(@class, "views-row")]'
    roots = selector.xpath(ruler) #拿到根对象的列表,可以对这个列表中的成员继续xpath
    # 由于这次是在win上测试,所以文件打开设定编码方式为utf-8
    with open("sentence.txt", "a", encoding="utf-8") as ob:
        for root in roots:
            try:
                data["sentence"] = root.xpath('./div/div[1]/a/text()')[0] #句子
                data["loved"] = root.xpath('./div/div[3]/a/text()')[0] # 喜欢
                data["comment"] = root.xpath('./div/div[5]/a/text()')[0] # 评论
            except IndexError:
                # 处理第一页的杂质问题
                continue
            # 关闭默认的ascii编码
            ob.write(json.dumps(data, ensure_ascii=False))
            ob.write("\n")


def main():
    for i in range(4):
        if i:
            params = {"page":i}
        else:
            # 第一页的url地址比较特别,所以单独处理
            params ={}
        html = get_html(params)
        if html:
            parse_html(html)
    print("结束")

if __name__ == "__main__":
    main()

结果:
Python爬虫

需要的总结:

原本没打算总结的。原本只是做一次用xpath提取数据的示范。以为像句子迷这样的小网站爬起来会很容易,确实是,却也不是。
网页静态呈现,需要的数据都可以通过xpath直接拿到。主要遇到的问题是该网站设置了重定向,就是说直接访问我设置的url地址时,会被重定向到另一个地址去。根据xpath没拿到返回值这一现象,我打印了实际请求地址,结果显示的确被重定向了。我当然第一反应关闭了 get请求中的重定向开关。这之后拿不到数据,状态码返回302。特地百度一下,302是暂时性重定向的意思,它的危害性比较大,主要是可能被黑客利用进行url劫持,也可能恶意刷网站排名,被建议尽量不用或少用。
正确处理方式:请求报文头中一定要加Referer值。老实说,之前也爬过一些大型网站,Referer值从来不带的,这次是长知识了。

收藏
评论区

相关推荐

浅谈Python两大爬虫库——urllib库和requests库区别
一、前言在使用Python爬虫时,需要模拟发起网络请求,主要用到的库有requests库和python内置的urllib库,一般建议使用requests,它是对urllib的再次封装。那它们两者有什么区别 ?下面通过案例详细的讲解 ,了解他们使用的主要区别。 二、urllib库 简介:urllib库的response对象是先创建http,request对象
手把手教你使用XPath爬取免费代理IP
大家好,我是霖hero。前言 可能有人说,初学者Python爬虫爬数据太难啦,构造正则表达式的时候,太烦琐了,眼睛都看花了,而且前一秒还可以愉快地爬取,下一秒IP就被封了,这还爬个屁啊,不爬了。哎,不要着急,这篇文章我们教你如何使用XPath来爬取快代理中的免费代理IP,告别眼花,告别IP被封的烦恼。XPath首先我们来简单了解一下XPath,想要了解更多
lxml简明教程
from:https://www.cnblogs.com/ospider/p/5911339.html 最近要做下微信爬虫,之前写个小东西都是直接用正则提取数据就算了,如果需要更稳定的提取数据,还是使用 xpath 定位元素比较可靠。周末没事,从爬虫的角度研究了一下 python xml 相关的库。 Python 标准库中自带了 xml 模块,但是性能不
Flask restful_api服务器端
[使用python的Flask实现一个RESTful API服务器端](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.cnblogs.com%2Fvovlie%2Fp%2F4178077.html) -----------------------------------------
FreeBSD python安装MySQL
fetch https://pypi.python.org/packages/source/M/MySQL-python/MySQL-python-1.2.4.zip unzip MySQL-python-1.2.4.zip cd MySQL-python-1.2.4 python setup.py install ln -s /usr/loca
Python 3 教程
Python 3 教程 =========== ![python3](https://www.runoob.com/wp-content/uploads/2014/05/python3.png) Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,
Python Flask搭建一个视频网站实战视频教程
[点击了解更多Python课程>>>](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fwww.cnblogs.com%2Fshaohan%2Fcategory%2F1123236.html) --------------------------------------------------
Python Xpath 提取html整个元素(标签与内容)
提取html某标签中文字时,文字中含有:“<sub>2</sub>O<sub>5</sub>”,导致提取的文字不符合预期。 解决方法: #coding=utf-8 from lxml import etree from HTMLParser import HTMLParser html = u''' <h
Python在网页上展示表格的简单方法
![](https://oscimg.oschina.net/oscnet/22596eed-3e2a-4708-acc1-bc8a22f8588d.jpg) * Python是当今最热门的编程语言 * Pandas是Python下最热门的数据处理与数据分析的库 * Flask是Python下方便简洁的Web开发框架
Python常用的标准库以及第三方库有哪些?
[Python常用的标准库以及第三方库有哪些?](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.cnblogs.com%2Fjiangchunsheng%2Fp%2F9275881.html) ============================================
Python爬虫
Python爬虫-xpath ============== * Python爬虫-xpath * 说明 * 再说明 * 插件推荐 * 语法讲述 * 举栗子 * 代码里使用 * 实战句子迷 * 需要的总结: 说明 -- 关于Python爬虫请求数据方面的知
Python解析库lxml与xpath用法总结
点击上方“**IT共享之家**”,进行关注 回复“**资料**”可获赠Python学习福利 今 日 鸡 汤 欢笑情如旧,萧疏鬓已斑。 本文主要围绕以xpath和lxml库进行展开: 一、xpath 概念、xpath节点、xpath语法、xpath轴、xpath运算符 二、lxml的安装、lxml的使用、lxml案例 **一、xpa
Python调用C语言函数
在C调用Python模块时需要初始化Python解释器,导入模块等 但Python调用C模块却比较简单,ctypes模块提供了和C语言兼容的数据类型和函数来加载dll或so文件,因此在调用时不需对源文件做任何的修改 1.编写C语言代码,可参考 [https://www.cnblogs.com/zhouzhishuai/p/9529487.html](ht
sublime与python交互
* 点击菜单栏中的工具 —> 编译系统,勾选Python即可  * 创建hello.py文件,Ctrl+S保存文件,Ctrl+B执行文件,结果如下图 ![](https://oscimg.oschina.net/oscnet/c28202d736869281e2267c6868b6c7c393e.png) 3.sublime运行python文件的
Python网络爬虫中重新请求,请问有什么比较好的解决方法?
大家好,我是皮皮。 一、前言前几天在Python钻石群有个叫【某嘟】的粉丝问了一个关于Python网络爬虫中重新请求的问题,这里拿出来给大家分享下,一起学习。 二、解决过程这里【D I Y】大佬给了一个思路,确实可行。不过后来她自己又找到了一个更好的方法,找到一个HTTPAdapter可以实现超时重试,大概用法如下:from requests.adapter