Python爬虫必备技能,xpath的用法和实战

举报
Python编程与实战 发表于 2019/05/23 16:42:12 2019/05/23
【摘要】 环境配置本文使用的python版本是python3使用到的依赖包如下:```pythonpip install requestspip install scrapy```在安装scrapy之前需要先安装Twisted(点击下载) 下载符合自己版本的Twisted,然后将其放入python安装目录中,先使用命令安装pip install Twisted。安装完之后,scrapy就很容易安装了,...

环境配置

  1. 本文使用的python版本是python3

  2. 使用到的依赖包如下:

```python

pip install requests

pip install scrapy

```

在安装scrapy之前需要先安装Twisted(点击下载) 下载符合自己版本的Twisted,然后将其放入python安装目录中,先使用命令安装pip install Twisted。安装完之后,scrapy就很容易安装了,安装命令如下:pip install scrapy

1240

本文要点

1.xpath 基本语法和用法示例

2.使用 xpath 爬取《盗墓笔记》实例

xpath 基本语法

xpath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言。

xpath的选择功能十分强大,它提供了非常简洁明了的路径选择表达式,几乎所有我们想要定位的节点都可以用xpath来选择。首先我们来看下xpath的基本语法。

1240

1240

在这里列出了xpath的常用匹配规则,例如 / 代表选取直接子节点,// 代表选择所有子孙节点,. 代表选取当前节点,.. 代表选取当前节点的父节点,@ 则是加了属性的限定,选取匹配属性的特定节点。

xpath 用法举例

接下来我们以豆瓣电影为例子,来熟悉一下xpath基本用法:

打开网页 https://movie.douban.com/top250

1240

豆瓣电影top250

首先需要找到我们所匹配的内容在html中的位置。

从图片中可以看到排名第一的电影标题是在标签为div,class属性为*hd中的a标签中所有的span标签里面!

然后我们需要一级一级往上面找,因为这个层级太深了,有时候会匹配不到我们所需要的内容。

我们最开始匹配的标签要满足它的所有特征加起来是唯一的。

很容易看到属性为article正是我们所需要的标签!因为找不到第二个div标签且class属性为article的标签!

获取电影标题语法如下,因为是文本内容,所以要用text()

html.xpath(".//div[@class='article']/ol/li[1]//div[@class='hd']/a//span[1]/text()")

同理,我们获取电影详情链接的语法,因为是属性,所以要用@属性值

html.xpath(".//div[@class='article']/ol/li[1]//div[@class='hd']/a/@href")

我们可以将其加入到爬虫代码中,效果如下:

1240

豆瓣电影爬虫

使用 xpath 爬取盗墓笔记

目标地址:

盗墓笔记全篇 http://seputu.com/

总体思路:

1.分析网页结构,取出我们需要的标题,以及下一步需要用到的链接

2.根据章节的链接地址,再爬取出章节小说

首先分析我们需要爬取的内容,在网页中的位置。

1240

经过上面的讲解,相信大家很容易就可以写出xpath的语法。因为我们是要爬取所有小说内容,所以我们要循环所有li标签里面的内容!

```python

html.xpath(".//div[@class='box']/ul//li")

```

遍历这个列表,取出我们所需要的章节,详细链接

```python

li_list = selector.xpath(".//div[@class='box']/ul//li")

fortextinli_list:

title = text.xpath("./a/text()").extract_first('')

href = text.xpath('./a/@href').extract_first('')

```

接下来,从详情链接中取出小说内容,即完成了这个小爬虫!

1240

```python

p_list = selector.xpath(".//div[@class='content-body']//p")

fordatainp_list:

content += data.xpath("./text()").extract_first('')

```

最重要的分析部分完成了,接下来主要就是将所有的内容放入代码中,然后保存到本地就完成了。

1240

最终爬虫代码如下:

```python

# coding: utf-8

fromscrapyimportSelector

importrequests

classKeyEnum(object):

TITLE ="title"

CONTENT ="content"

HREF ="href"

classNovelSpider(KeyEnum):

def__init__(self):

self.headers = {

"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "

"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"

}

defspider(self):

url ='http://seputu.com/'

response = requests.get(url, headers=self.headers)

selector = Selector(text=response.content)

data_list = []

li_list = selector.xpath(".//div[@class='box']/ul//li")# 章节列表

fortextinli_list:

title = text.xpath("./a/text()").extract_first('')# 标题

href = text.xpath('./a/@href').extract_first('')# 链接

content = self._content_spider(href)# 详情页面爬虫

data_list.append(

{

KeyEnum.HREF: href,

KeyEnum.TITLE: title,

KeyEnum.CONTENT: content,

}

)

returndata_list

def_content_spider(self, url):

content =''

for_inrange(5):# 因为没用代理,如果失败,再重试5次

ifurl:# 加个url是否为空的判断

response = requests.get(url, headers=self.headers)

ifresponse.status_code !=200:

continue

selector = Selector(text=response.content)

p_list = selector.xpath(".//div[@class='content-body']//p")

fordatainp_list:

content += data.xpath("./text()").extract_first('')

returncontent

defmain(self):

data_list = self.spider()

foriindata_list:

withopen('盗墓笔记.txt','a', encoding='utf-8')asf:

f.write(i['content'])

if__name__ =='__main__':

spider = NovelSpider()

spider.main()

```

总结

本文主要介绍了 python 中解析库xpath的使用方法和示例,用法其实很简单,关键在于多多练习!下篇文章打算分享另一个解析库css的用法,以及和xpath之间的区别,欢迎关注!


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。