本文为自己学习笔记,仅供大家讨论学习。请谨慎使用,避免出现死循环等bug,导致对应网站服务器宕机!
因审核问题,修改多次,
单独出现的 runoob 都表示"https://www.runoob.com"
字符串,注意结尾没有斜杠/
可能是代码过多、或链接过多,删除了处理链接的代码、完整代码。若需要可私聊,回头有时间把代码放托管平台上(GitHub或gitee)
python配置
Python下载、环境变量配置、代码编辑器、py库下载等。
这里使用的Python3(3.10.5),和2.x有的内容并不兼容。
这里没用到请求参数、请求头、cookie、JSON数据等,这里不赘述。
开始
基础知识请查阅 Python3基础 语法
Python requests
使用urllib:
from urllib import request
if __name__ == '__main__':
resp = request.urlopen('请求地址')
print(resp.read())
或者requests:
import requests
url = "请求地址" # 网页地址
res = requests.get(url)
print(res) # response对象
print(res.text) # 成功返回内容
print(res.status_code) # status=200
print(res.headers) # response headers
http请求
相关知识请查阅 http协议 相关。
- 网页请求为
get
方法,请求参数(params)拼接在路径(url)中,路径与键值对以?
分隔,属性和属性值(键值对)以=
相连(空值可不填),不同属性之间用&
相连。语法:url?key1=value1&key2=value2
- 响应状态(
200 <= response.status < 300
)为2**时是成功,这里用200作判断。 - 发送请求时,有些参数是放在请求头(request headers)中:有些表示登录信息,有些表示浏览器版本、尺寸、有的表示时区、语言等。有的网址不需要请求头(比如runoob.com不要是成功的,加其他网址的headers反而报错),有的网址必须要有正确的请求头(参考文章:网络资源获取工具requests库介绍)。
- 设置请求头信息,并添加请求头。(这里设置浏览器信息、cookie都失败,不设反而成功,以后再研究)
import requests url = runoob+"/python3" # 网页地址 headers = { # 浏览器基本信息 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36' } res = requests.get(url,headers)
- 综合判断:
try: res = requests.get(url, headers,cookie) if res.status_code == 200: print(res) else: print(f"失败:{ url}") print(res.status_code) print(res.text) except: print(f"失败:{ url}")
分析html
相关知识请查阅 前端html 相关
- 目前要爬的目标是:Python3教程
runoob+/python3
(它会重定向到:runoob+/python3/python3-tutorial.html) - 查看该网址的网页结构(右键检查或F12),可发现该网址结构清晰,没有压缩,没有隐藏乱七八糟的东西(如暗链、广告、模态窗等),解析爬取是比较简单的。
- 菜单是
id="leftcolumn"
的div,爬取其子节点的a标签,其href
和text
拿来存储起来拿出来,遍历爬取子页面的内容。我这里是不用原布局,不爬取多余内容。把目录拿来自己写html页面。 - 根据菜单生成的list遍历,爬取其
href
子页面,每个页面都是相同结构,主体内容都是id="content"
的节点中。将每个页面的content内容单独存储html文件里。名字和菜单href
保持一致。 - content中,外链资源肯定有重复的,避免重复下载,浪费时间资源,统一存储目录规则,重复不保存。先说静态资源(image、js、css,其他媒体文件如视频音乐暂时没发现)。以当前Python脚本所在为根目录,如下存到
./wp-content/themes/runoob/style.css
:<link rel="stylesheet" href="/wp-content/themes/runoob/style.css?v=1.169