一、需求
此代码是为完成波波老师python爬虫视频作业所做
对应视频: 波波老师B站视频[P28] 对应up为:路飞学城IT
基本要求:
爬取站长素材中免费简历模板
进阶要求:
1.能够翻页爬取
2.能够根据网页上的内容自动命名文件
3.能够处理中文命名乱码问题
4.将文件统一保存在一个新创建的文件夹内
二、代码
1. 引入库
# -*- codeing = utf-8 -*-
# @Time: 2021/1/4 4:06
# @Author: Si
# @File: test_xpath作业_爬取站长素材中免费简历模板.py
# @Software: PyCharm
import requests
from lxml import etree
import os
import time
from requests.adapters import HTTPAdapter #有关超时重置的模块
2. main()
此处指定url,并通过for循环,使自动变更的url可以完成翻页功能,完成第一轮页面访问和xpath解析。
def main():
if not os.path.exists('./jianlimuban'): #如果没有此文件夹,则创建一个
os.mkdir('./jianlimuban')
headers = {
"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64;x64;rv: 84.0) Gecko / 20100101 Firefox / 84.0"
}
url = 'https://sc.chinaz.com/jianli/free_%d.html'
for i in range(1,10): #意思一下,只爬到第9页
url = 'https://sc.chinaz.com/jianli/free_%d.html'%i #翻页功能
print(url)
if i == 1:
url = 'https://sc.chinaz.com/jianli/free.html' #第一页网址比较特殊
print(url)
page_text = requests.get(url=url, headers=headers).text
tree = etree.HTML(page_text)
div_list = tree.xpath('//div[@id="main"]/div/div')
saveData(div_list)
3. saveData(div_list)
实现访问模板概览页面,并进入下载页面,然后再存储的功能, 此部分功能比较长,所以单独拉出来做一个模块。
访问页面,xpath解析,识别出模板名称,确定存储路径。
def saveData(div_list):
headers = {
"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64;x64;rv: 84.0) Gecko / 20100101 Firefox / 84.0"
}
for div in div_list:
url_href = div.xpath('./a/@href')[0]
url_href = 'https:' + url_href
# 访问页面
page_text_xiazai = requests.get(url=url_href, headers=headers).text
# xpath解析
tree_xiazai = etree.HTML(page_text_xiazai)
url_li = tree_xiazai.xpath('//div[@id="down"]/div/ul/li[11]/a/@href')[0] # xpath得到的是列表,别忘了后面加[0]
# 确定文件名称
jianli_name = tree_xiazai.xpath('//div[@class="bgwhite"]/div/h1/text()')[0] + '.rar' # 格式是一起写在文件名里的
jianli_name = jianli_name.encode('iso-8859-1').decode('utf-8') # 这里decode用utf-8,是因为网站源代码的charset值是utf-8,也就是编码方法,自然对应decode解码
# 确定存储路径
jianli_path = './jianlimuban/' + jianli_name # 别忘了这里的文件夹名后加斜杠'/'
超时重置的设置。自我拓展新知识点。
# 超时重置的设置
s = requests.Session()
s.mount('http://', HTTPAdapter(max_retries=5)) #这里是最大重试次数,重试5次,加最初一次,一共6次
s.mount('https://', HTTPAdapter(max_retries=5)) #两种访问,都要分别设置
获取文件数据,持久化存储文件。
# 获取文件数据
jianli_data = s.get(url=url_li, headers=headers,timeout=10).content # timeout这个是超时的时间限制
# 存储文件
with open(jianli_path, 'wb') as fp:
fp.write(jianli_data)
print(jianli_name, '下载成功')
fp.close()
time.sleep(1) #睡眠1秒钟后继续,针对反爬的演练
4. 收尾
if __name__ == '__main__':
main()
print('over')
结语
如果对代码有疑问或其他问题,欢迎评论告诉我,我会常来看 (毕竟面向CSDN编程) 。我也是一个刚刚学习python的新手,希望在疫情期间迎头赶上,欢迎大家一起讨论,共同进步。