鱼C论坛

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

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

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

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

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

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

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

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

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-9-28 10:18:00 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-9-28 12:02:05 | 显示全部楼层
#练习一下

  1. -*- coding: UTF-8 -*-
  2. # =================================================
  3. #      language       : Python3.7
  4. #      IDLE           :  pycharm
  5. #      Library needed : lxml,requests
  6. #      Date           :  09/28/2019
  7. # =================================================
  8. import csv, time
  9. import requests
  10. from lxml import etree


  11. def get_html(url, headers):
  12.     try:
  13.         r = requests.get(url=url, headers=headers)
  14.         return r.text
  15.     except requests.ConnectionError as e:
  16.         print('Error')


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


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


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


  41. if __name__ == '__main__':
  42.     #start = time.time()
  43.     main()
  44.     #print( time.time()- start)
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-10-6 01:52:23 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-6 04:12:06 From FishC Mobile | 显示全部楼层
Take a look
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-6 11:16:51 | 显示全部楼层
学习一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-6 12:39:19 | 显示全部楼层
一起加油
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  12. headers = {
  13.     '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'}

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

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

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

  56. def main():
  57.     get_url()
  58.     get_data()
  59.     save_data()
  60.     save_img()

  61. if __name__ == '__main__':
  62.     main()
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-11 08:49:59 From FishC Mobile | 显示全部楼层
学习大神
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-21 20:37:31 | 显示全部楼层
围观
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-13 14:16:48 | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-5 16:28:27 | 显示全部楼层
谢谢大哥
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

可以共享下吗?网上下载的不能用啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-13 02:21:58 | 显示全部楼层
1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-1-5 18:05:37 | 显示全部楼层
xiangkan
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-7 18:43:50 | 显示全部楼层
谢谢分享
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-27 22:29:10 | 显示全部楼层
呆家学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-2 15:17:13 | 显示全部楼层
666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-26 07:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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