模块使用如下
import requests
from lxml import etree
import os
import time
requests库以及lxml库均为第三方库需另外安装。
requests用于网页的请求部分
1.构建网页请求函数,URL作为参数,返回requests对象。
def url_open(url):
# 网页请求
web_data = requests.get(url)
return web_data
lxml用于解析网页结构,寻找特定元素
2.构建网页结构解析函数,URL及xpath路径作为参数,返回检索结果列表
def get_element(url,paths):
# 解析成html格式
html = url_open(url).text
# 解析html
tree = etree.HTML(html)
tag = []
for path in paths:
# 检索特定标签元素
#将检索结果生成list
tag.append(tree.xpath(path))
return tag
3.构建主函数
初始参数如下
包括首页的URL,并装于list中
urls = ['https://movie.douban.com/top250']
paths = ['//div[@class="paginator"]/a/@href']
paths_2 = ['//div[@class="pic"]/em','//div[@class="hd"]/a/span[1]','//div[@class="star"]/span[@class="rating_num"]','//div[@class="item"]//a/img/@src']
由于需要获取的网页有多个,所以将所有URL放入一个list
从首页解析到的只是URL的尾部,故此处使用了列表生成式将URL补全
lists = ['https://movie.douban.com/top250/{}'.format(str(x)) for x in get_element(urls[0],paths)[0]]
将生成的list并入之前首页URL所在的list,便于接下来的处理
urls.extend(lists)
dic = []
for url in urls:
time.sleep(2)
# 各元素的列表的集合列表
element_lists = get_element(url,paths_2)
nums = element_lists[0]
names = element_lists[1]
scores = element_lists[2]
imgs = element_lists[3]
将每一个电影的信息保存在一个dictionary中
for i in range(0,len(nums)):
# 对应电影字典在排名list中的位置
n = int(nums[i].text)-1
# 每一条电影的信息保存在一个字典中
dict_film = {}
dict_film['num'] = str(n+1)
dict_film['name'] = names[i].text
dict_film['score'] = scores[i].text
dict_film['imgs'] = imgs[i]
#加入list
dic.append(dict_film)
将图片保存
#图片保存的相对路径
file_path = r"E:\\课件\pic"
#创建文件夹
os.makedirs(file_path)
for d in dic:
print("%-5s %-5s %-20s"%(d['num'],d['score'],d['name']))
#改变文件操作状态为file_path路径
os.chdir(file_path)
#图片保存的文件名
file_name = d['name']+ '.' + d['imgs'].split('.')[-1]
#获取图片的二进制数据
img = url_open(d['imgs']).content
#文件的保存操作
with open(file_name,'wb') as f:
f.write(img)
整体代码如下
import requests
from lxml import etree
import os
import time
def url_open(url):
# 网页请求
web_data = requests.get(url)
return web_data
def get_element(url,paths):
# 解析成html格式
html = url_open(url).text
# 解析html
tree = etree.HTML(html)
tag = []
for path in paths:
# 检索特定标签元素
#将检索结果生成list
tag.append(tree.xpath(path))
return tag
def main():
urls = ['https://movie.douban.com/top250']
paths = ['//div[@class="paginator"]/a/@href']
paths_2 = ['//div[@class="pic"]/em','//div[@class="hd"]/a/span[1]','//div[@class="star"]/span[@class="rating_num"]','//div[@class="item"]//a/img/@src']
lists = ['https://movie.douban.com/top250/{}'.format(str(x)) for x in get_element(urls[0],paths)[0]]
urls.extend(lists)
dic = []
for url in urls:
time.sleep(2)
# 各元素的列表的集合列表
element_lists = get_element(url,paths_2)
nums = element_lists[0]
names = element_lists[1]
scores = element_lists[2]
imgs = element_lists[3]
for i in range(0,len(nums)):
# 对应电影字典在排名list中的位置
n = int(nums[i].text)-1
# 每一条电影的信息保存在一个字典中
dict_film = {}
dict_film['num'] = str(n+1)
dict_film['name'] = names[i].text
dict_film['score'] = scores[i].text
dict_film['imgs'] = imgs[i]
#加入list
dic.append(dict_film)
#图片保存的相对路径
file_path = r"E:\\课件\pic"
#创建文件夹
os.makedirs(file_path)
for d in dic:
print("%-5s %-5s %-20s"%(d['num'],d['score'],d['name']))
#改变文件操作状态为file_path路径
os.chdir(file_path)
#图片保存的文件名
file_name = d['name']+ '.' + d['imgs'].split('.')[-1]
#获取图片的二进制数据
img = url_open(d['imgs']).content
#文件的保存操作
with open(file_name,'wb') as f:
f.write(img)
if __name__ == '__main__':
main()
缺少容错机制
功能较少
数据结构使用简单
还在学习中,进一步完善。