文章目录
写在前面,源代码仅供学习交流,请各位尊重网络秩序,合理、合法使用爬虫。
这次是用我自己写的requests 功能库 和lxml函数库 制作的爬虫,分为两个PY文件
一个是库的支持文件如下:在另外一个主运行文件中,需要加载这个文件
功能库的注释,已经尽可能写得比较完整,可以拿来直接用,制作其他的爬虫。
import requests
import os
from lxml import etree
from requests.exceptions import RequestException
def get_page(url):
"""
该函数负责requests.get动作
获取url的HTML信息
:param url:传入一个url
:return: 返回一个二进制的字符串,用于XPATH解析
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3)'
' AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/65.0.3325.162 Safari/537.36'
}
try:
html = requests.get(url, headers=headers)
print('正在获取当前%s页面的信息……' % url)
if html.status_code == 200:
return html.content
return None
except RequestException:
return None
def parse_by_xpah(content, xpath, keyword='', start_n=None, end_n=None):
"""
该函数解析网页并返回选取结果的列表
:param content: 二进制的HTML信息
:param xpath:提取信息的XPath语句
:param keyword: 用于保证结果有效性的关键词
:param start_n:结果切片的开始位置
:param end_n:结果切片的结束位置
:return: 提取的结果列表
"""
result_list = []
html = etree.HTML(content)
result = html.xpath(xpath)
for i in result:
if keyword in i and not i in result_list:
result_list.append(i[start_n:end_n])
else:
continue
return result_list
def make_dir(file_path):
"""
如果文件夹不存在,就创造一个文件夹
:param file_path: 传入一个文件夹的路径
"""
if not os.path.exists(file_path):
os.makedirs(file_path)
print("【%s】文件夹不存在,正在创建!" % file_path)
def get_down(down_url):
"""
该函数只负责下载对象,返回二进制信息
:param down_url: 下载目标的URL
:return: 下载目标的二进制结果
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3)'
' AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/65.0.3325.162 Safari/537.36'
}
try:
down = requests.get(down_url, headers=headers)
if down.status_code == 200:
print("正在下载" + down_url)
return down.content
except RequestException:
return None
def save_file(content, name_path, mode='wb'):
"""
保存文件
:param content:写入的数据
:param name_path:文件的完整路径
:param mode:读写的方式
"""
with open(name_path, mode) as f:
f.write(content)
print('将文件保存在' + name_path)
下面是运行的主文件:
# -*- coding: utf-8 -*-
# 这是加载的上面的功能库
from requestandxpath import *
import time
import os
# 被爬网站的主URL,构成其他URL的基础
base_url = 'http://www.ypppt.com/'
# 在引号内选择类型的拼音,可选类型有 moban beijing tubiao sucai
class_url = 'sucai'
# 爬取的起始页数
start_page = 1
# 爬取的最大页数
max_page = 20
# 爬取间隔时间
sleep_time = 1
# 最终目标的扩展名,用于验证结果有消息
purpose = ['.zip', '.rar', '.ppt', '.pptx', '.jpg', '.ico', '.png']
# 默认存在当前文件夹下的PPT文件夹下
file_path = "./ppt/"
download_index = 1
for index in range(start_page, max_page + 1):
if index == 1:
url = base_url + '/' + class_url + '/'
else:
url = base_url + '/' + class_url + '/list-' + str(index) + '.html'
main_url = get_page(url)
main_parse = parse_by_xpah(main_url, xpath='//a[@class="p-title"]/@href')
if main_parse is None:
continue
# 遍历返回的列表,继续解析
for part_list in main_parse:
# 进入单个项目的页面
part_url = get_page(base_url + part_list)
# 解析提取下载页的URL
part_parse = parse_by_xpah(part_url, xpath='//a[@rel="nofollow" and @class="down-button"]/@href')
# 解析提取该项目的名称
file_name = parse_by_xpah(part_url, xpath='//div[@class ="infoss" ]/h1/text()')
# 进入下载页
click_downlond = get_page(base_url + part_parse[0])
click_parse = parse_by_xpah(click_downlond, xpath='//a[contains(text(), "下载地址1")]/@href')
print('解析出的最终下载地址为:', click_parse[0])
if click_parse is None:
continue
# 获取下载文件的扩展名
ext = os.path.splitext(click_parse[0])[-1]
if ext not in purpose:
continue
# 开始下载
down_result = get_down(click_parse[0])
# 创建文件夹
make_dir(file_path + '/')
# 保存文件
try:
save_file(down_result, file_path + file_name[0] + ext)
except:
break
download_index += 1
time.sleep(sleep_time)
print('已下载%s个文件' % download_index)