以爬取豆瓣Top250的电影为例,说说xpath的使用

Html解析

采用的requests获取网页源码,常用解析网页的库由beautifulSoup和lxml,我采用的是lxml进行解析html,应为chrome浏览器自带获取标签路径,超好用的,见下图
在这里插入图片描述

爬去思路:
1.找到种子url,http://movie.douban.com/top250/。
2.找到翻页的 url http://movie.douban.com/top250/%s
3.通过种子页面,找到总共由多少页。
4.根据3中获取的页码,通过2来获取每页的数据
5.整理数据和解析数据。

解析数据
解析数据是一个非常耗时的过程,除非网站有反扒机制,否则最耗时的当然是解析数据。如何解析数据,若是没有 chrome 浏览器提供的 copy/xpath 的话,够你折腾了,需要你结构化HTML文件,然后顺着结构找你需要的信息路径。

给出爬去豆瓣top250电影的源码

from lxml import etree
import requests as rq

source_url = 'http://movie.douban.com/top250/'
url_form = 'http://movie.douban.com/top250/%s'


# 获取网页内容
def get_html(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
    }## 请求头
    return rq.get(url, headers).content


def parse_page(content):
    html = etree.HTML(content)
    pages = html.xpath('//*[@id="content"]/div/div[1]/div[@class="paginator"]/a/@href')  # 获取页码
    return pages


def parse_item(content):
    html = etree.HTML(content)
    grid_view = html.xpath('//*[@id="content"]/div/div[1]/ol/li')
    for i in range(len(grid_view)):
        item = []
        # title
        image_url = '//li[%d]/div[@class="item"]/div[@class="pic"]/a/img/@src' % (i + 1)
        image_url_list = grid_view[i].xpath(image_url);
        item.append(image_url_list[0])
        # print("image_url:", image_url_list)

        # item_url
        item_url = '//li[%d]/div[@class="item"]/div[@class="info"]/div[@class="hd"]/a/@href' % (i + 1)
        item_url_list = grid_view[i].xpath(item_url)
        item.append(item_url_list[0])
        # print("item_url:", item_url_list)

        # image_title
        item_title = '//li[%d]/div[@class="item"]/div[@class="info"]/div[@class="hd"]/a/span[@class="title"]' \
                     '/text()' % (i + 1)
        item_title_list = grid_view[i].xpath(item_title)
        item.append(item_title_list[0])
        # print("item_title:", item_title_list)

        # item_other
        item_other = '//li[%d]/div[@class="item"]/div[@class="info"]/div[@class="hd"]/a/span[@class="other"]' \
                     '/text()' % (i + 1)
        item_other_list = grid_view[i].xpath(item_other)
        item.append(item_other_list[0])
        # print("item_other:", item_other_list)

        # item_score
        item_score = '//li[%d]/div[@class="item"]/div[@class="info"]/div[@class="bd"]/div[@class="star"]' \
                     '/span/text()' % (i + 1)
        item_score_list = grid_view[i].xpath(item_score)
        item.append(item_score_list[0])
        item.append(item_score_list[1])

        # print("item_score:", item_score_list)

        print('---------------------------splitter--------------------------------------')
        print(item)
        # return all_item_list


def main():
    parse_item(get_html(source_url))
    page_list = parse_page(get_html(source_url))
    for i in page_list:
        url = url_form % i
        parse_item(get_html(url))
if __name__ == '__main__':
    main()

上面是整个爬取流程,我相信你对其中的细节很像知道,不然也不会看到这里了。下面是xpath的所用的一些语法:

  • 区分路径
<li>
	<div class="pic">……</div>
	<div class="info">……</div>
</li>

若是一个标签下,有两个完全一抹一眼的同类标签,如何进行区分呢,根据属性,如class
获取属性为pic下面的所有内容,则需要添加@class==“pic”,并用[]包起来。

路劲/div[@class="pic"]
  • 获取属性内容
<a href="https://movie.douban.com/subject/1292052/">
	<img 
	width="100" 
	alt="肖申克的救赎" 
	src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp">
</a>

通过Google中copy/xpath获取标签的路径

//*[@id="content"]/div/div[1]/ol/li[1]/div/div[1]/a

如果想获取href的内容,只需要在上面路劲后面加上**@href**

//li[%d]/div[@class="item"]/div[@class="info"]/div[@class="hd"]/a/@href
  • 获取标签内容
<span class="title">肖申克的救赎</span>

同理获取路径如下:

//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]

要想获取“肖申克的救赎”,这几个字只需要在这个路基后面加入上text()

//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]/text()

xpath使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术人Howzit

钱不钱的无所谓,这是一种鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值