鱼C论坛

 找回密码
 立即注册
查看: 5972|回复: 34

[技术交流] [复习笔记]---Xpath数据解析,大致介绍

[复制链接]
发表于 2019-9-27 23:42:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Stubborn 于 2019-9-28 00:22 编辑

前面的帖子已经有介绍了Request,知道如何向一个url发送GET或者POST请求了,然而,当我们得到响应体,是一个HTML体,也就是网页的源码,我们应该怎么提取自己需要的信息呢。

下面贴一个简单的Xpath使用Demo
# -*- coding: utf-8 -*-
# !/usr/bin/python3
"""
Created 2019-9-27
@author: 1263270345@qq.com / Alex
"""
# 如何使用Xpath简单demo
import requests
from lxml import etree
response = requests.get(url="https://movie.douban.com/top250").text
html = etree.HTML(response)
li_list = html.xpath('//ol[@class="grid_view"]/li')
for li in li_list:
    a_href = li.xpath("./div/div[1]/a/@href")
    img_alt = li.xpath("./div/div[1]/a/img/@alt")
    comments_number = li.xpath("./div/div[2]/div[2]/div/span[4]/text()")
    move_comment = li.xpath("./div/div[2]/div[2]/p[2]/span/text()")

下面分享,记得结合简单Demo一起看哦

游客,如果您要查看本帖隐藏内容请回复


结语,到这里,Xpath介绍完了,渔友们可以结合前面的Request + Xpath来采集网页了。
课后练习题,有兴趣的朋友可以去练习下
        1. 腾讯招聘 数据获取
                采集网址:https://careers.tencent.com/search.html
                采集目标:职位名字 职位简介 工作职责 工作要求
                采集要求:
                        * 必须使用XPath来提取数据
                        * 数据保存到本地,最好是csv
            * 必须使用函数式的编程
       
        2. 豆瓣Top250数据提取  
                采集网址:https://movie.douban.com/top250
                采集目标:剧情简介 电影名称 电影图片 电影评分  评价人数
                采集要求:
                        * 由于这里介绍已经有代码,所以请尝试,直接xpath需要的内容,不提取li标签对
                        * 必须使用XPath来提取数据
                        * 必须使用函数式编程 尽量使用面向对象式编程
                        * 数据保存到本地,最好是csv

        3. 猫眼电影:
                采集网址:https://maoyan.com/board/4
                采集目标:电影名称 电影图片链接 主演  上映时间        电影评分
                采集要求:
                        * 必须使用XPath来提取数据
                        * 必须使用函数式编程 尽量使用面向对象式编程
                        * 数据保存到本地,最好是csv

评分

参与人数 3荣誉 +16 鱼币 +14 贡献 +12 收起 理由
文静 + 5 + 5 + 3 感谢楼主无私奉献!
摘星之云 + 5 + 3 + 3 无条件支持楼主!
zltzlt + 6 + 6 + 6

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-28 10:18:00 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-28 12:02:05 | 显示全部楼层
#练习一下
 -*- coding: UTF-8 -*-
# =================================================
#      language       : Python3.7
#      IDLE           :  pycharm
#      Library needed : lxml,requests
#      Date           :  09/28/2019
# =================================================
import csv, time
import requests
from lxml import etree


def get_html(url, headers):
    try:
        r = requests.get(url=url, headers=headers)
        return r.text
    except requests.ConnectionError as e:
        print('Error')


def parsed_data(content):
    movie_list = []
    et = etree.HTML(content)
    info = et.xpath("//div[@class='movie-item-info']")
    score = et.xpath("//div[contains(@class,'score-num')]/p")
    img = et.xpath("//img[@class='board-img']/@data-src")
    for e, i, j in zip(info, score, img):
        lst = [x.xpath('string(.)').strip() for x in e.xpath('./p')]
        lst.append(''.join(i.xpath('.//i/text()')))
        lst.append(j)
        movie_list.append(lst)
    return movie_list


def write2csv(lst):
    with open("result.csv", "a", newline="") as f:
        writer = csv.writer(f)
        writer.writerows(lst)


def main():
    base_url = r'https://maoyan.com/board/4?offset={}'
    ua = 'Mozilla/5.0 '
    headers = {'User-Agent': ua}
    for i in range(10):
        url = base_url.format(str(i * 10))
        write2csv(parsed_data(get_html(url, headers)))
        time.sleep(1)


if __name__ == '__main__':
    #start = time.time()
    main()
    #print( time.time()- start)

评分

参与人数 1荣誉 +3 鱼币 +5 贡献 +3 收起 理由
Stubborn + 3 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-10-6 01:52:23 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-6 04:12:06 From FishC Mobile | 显示全部楼层
Take a look
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-6 11:16:51 | 显示全部楼层
学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-6 12:39:19 | 显示全部楼层
一起加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-6 15:26:04 | 显示全部楼层
练习一下:爬豆瓣
import requests
from lxml import etree
import csv
import time

# 获取所有页面url,存放到urls列表中
urls = []
def get_url():
    # 爬取页数最大为10
    for i in range(10):
        url = 'https://movie.douban.com/top250?start=%d' % (i*25)
        urls.append(url)

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'}

# 提取指定数据,存放到datas和imgs列表中
datas = []
imgs = []
i = 1  # 电影序号,由开始爬取的页码决定(从第一页开始爬为1,第二页开始为26,第三页开始为51,以此类推)
def get_data():
    global i
    for url in urls:
        response = requests.get(url, headers=headers).text
        html = etree.HTML(response)
        for index in range(1, 26):
            data = []
            title = html.xpath('//ol[@class="grid_view"]/li[%d]//span[1][@class="title"]/text()' % index)[0]  # 电影标题
            try:
                introduction = html.xpath('//ol[@class="grid_view"]/li[%d]//span[@class="inq"]/text()' % index)[0]  # 电影简介,没有简介用空字符串替代
            except:
                introduction = ''
            rating = html.xpath('//ol[@class="grid_view"]/li[%d]//span[@class="rating_num"]/text()' % index)[0]  # 电影评分
            num = html.xpath('//ol[@class="grid_view"]/li[%d]//div[@class="star"]/span[4]/text()' % index)[0]  # 评分人数
            img_link = html.xpath('//ol[@class="grid_view"]/li[%d]//img/@src' % index)[0]  # 图片url
            img = requests.get(img_link).content
            data.extend(['No.%d'%i, title, introduction, rating, num])
            datas.append(data)
            imgs.append(img)
            print('\r已获取第 %d 条数据' % i, end='')
            i += 1
        time.sleep(3)

# 保存图片在当前目录下的imgs文件夹中
def save_img():
    i = 1  # 图片序号,由开始爬取的页码决定(从第一页开始爬为1,第二页开始为26,第三页开始为51,以此类推)
    for img in imgs:
        with open('imgs/%d.jpg'%i, 'wb') as f:
            f.write(img)
            print('\r已保存第 %d 张图片' % i, end='')
            i += 1

# 保存数据到csv文件中
def save_data():
    headers = ['排名', '电影名', '简介', '评分', '评分人数']
    with open('doubanmovietop250.csv', 'a', encoding='utf-8', newline='') as f:
        f_csv = csv.writer(f)
        f_csv.writerow(headers)
        f_csv.writerows(datas)
        print('\n已保存data')

def main():
    get_url()
    get_data()
    save_data()
    save_img()

if __name__ == '__main__':
    main()

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
Stubborn + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-10-8 12:16:03 | 显示全部楼层
学xpath的小伙伴最好装个这个插件哦

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-11 08:49:59 From FishC Mobile | 显示全部楼层
学习大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-21 20:37:31 | 显示全部楼层
围观
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-13 14:16:48 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-5 16:28:27 | 显示全部楼层
谢谢大哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 21:45:58 | 显示全部楼层
kk

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-11 23:11:22 | 显示全部楼层
Tghao 发表于 2019-10-8 12:16
学xpath的小伙伴最好装个这个插件哦

可以共享下吗?网上下载的不能用啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-13 02:21:58 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-5 18:05:37 | 显示全部楼层
xiangkan
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-7 18:43:50 | 显示全部楼层
谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-27 22:29:10 | 显示全部楼层
呆家学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-2 15:17:13 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 12:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表