[复习笔记]---Xpath数据解析,大致介绍
本帖最后由 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/a/@href")
img_alt = li.xpath("./div/div/a/img/@alt")
comments_number = li.xpath("./div/div/div/div/span/text()")
move_comment = li.xpath("./div/div/div/p/span/text()")
下面分享,记得结合简单Demo一起看哦
**** Hidden Message *****
结语,到这里,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 看看 #练习一下
-*- 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/p")
img = et.xpath("//img[@class='board-img']/@data-src")
for e, i, j in zip(info, score, img):
lst =
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) 看看
Take a look 学习一下 {:5_91:}一起加油 练习一下:爬豆瓣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[@class="title"]/text()' % index)# 电影标题
try:
introduction = html.xpath('//ol[@class="grid_view"]/li[%d]//span[@class="inq"]/text()' % index)# 电影简介,没有简介用空字符串替代
except:
introduction = ''
rating = html.xpath('//ol[@class="grid_view"]/li[%d]//span[@class="rating_num"]/text()' % index)# 电影评分
num = html.xpath('//ol[@class="grid_view"]/li[%d]//div[@class="star"]/span/text()' % index)# 评分人数
img_link = html.xpath('//ol[@class="grid_view"]/li[%d]//img/@src' % index)# 图片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() 学xpath的小伙伴最好装个这个插件哦https://xxx.ilovefishc.com/album/201910/08/121426gy9w37ygzyzsclgn.png 学习大神 围观
学习 谢谢大哥
kk
Tghao 发表于 2019-10-8 12:16
学xpath的小伙伴最好装个这个插件哦
可以共享下吗?网上下载的不能用啊 1 xiangkan 谢谢分享 呆家学习 666
页:
[1]
2