python爬虫教程

小钊
2024-06-24 / 0 评论 / 154 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年06月25日,已超过531天没有更新,若内容或图片失效,请留言反馈。

requests库及lxml库入门

靶场地址:http://spiderbuf.cn/s01/

from lxml import etree
import requests
import csv
html = requests.get("http://spiderbuf.cn/s01/").text    # 取网页源码
parse_html = etree.HTML(html)   # 解析html
data = []    # 初始化数据列表
data.append(parse_html.xpath("//thead/tr/th/text()"))   # 取标头内容并添加到数据列表
f = open("info.csv", 'w', encoding='utf-8', newline='') # 使用w打开info.csv文件
csv = csv.writer(f) # 创建csv对象
table = parse_html.xpath("//tbody//tr")  # 取所有的数据列
for i in table: # 循环每个数据列
    data.append(i.xpath(".//td//text()"))   # 读取每列的数据并添加到数据列表
csv.writerows(data) # 调用函数写入csv文件

此次练习使用了
1.lxml库的etree类,用于解析html并取相关数据
2.requests库,用于发起网页请求,获取网页源码
3.csv库,用于保存爬取到的数据

2.http请求分析及头构造使用

靶场地址:http://spiderbuf.cn/s02/

import requests
import csv
from lxml import etree
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
}
html = requests.get(url="http://spiderbuf.cn/s02/", headers=headers).text    # 取网页源码
parse_html = etree.HTML(html)   # 解析html
data = []    # 初始化数据列表
data.append(parse_html.xpath("//thead/tr/th/text()"))   # 取标头内容并添加到数据列表
f = open("info.csv", 'w', encoding='utf-8', newline='') # 使用w打开info.csv文件
csv = csv.writer(f) # 创建csv对象
table = parse_html.xpath("//tbody//tr")  # 取所有的数据列
for i in table: # 循环每个数据列
    data.append(i.xpath(".//td//text()"))   # 读取每列的数据并添加到数据列表
csv.writerows(data) # 调用函数写入csv文件

此题与第一题的区别是添加了请求头,因为网页做了请求头校验
requests默认的请求头是python

分页参数分析及翻页爬取

靶场地址:http://spiderbuf.cn/s04/?pageno=1

from lxml import etree
import requests
import csv
data = []  # 初始化数据列表
f = 1   # 标记是否是首次运行
for i in range(1, 6):    # 循环页数
    url = "http://spiderbuf.cn/s04/?pageno="+str(i)     # 拼接url
    print(url)
    html = requests.get(url).text  # 取网页源码
    parse_html = etree.HTML(html)  # 解析html
    if f:
        data.append(parse_html.xpath("//thead/tr/th/text()"))  # 取标头内容并添加到数据列表
        f = 0   # 运行后将值更改为0即非第一次运行
    table = parse_html.xpath("//tbody//tr")  # 取所有的数据列
    for i in table:  # 循环每个数据列
        td = i.xpath(".//td//text()")
        td.pop(0)
        data.append(td)  # 读取每列的数据并添加到数据列表
f = open("info.csv", 'w', encoding='utf-8', newline='')  # 使用w打开info.csv文件
csv = csv.writer(f)  # 创建csv对象
csv.writerows(data)  # 调用函数写入csv文件

这题难点在于拼接字符串时的数据类型,与初始化数据列表放置的位置

无序号翻页

靶场地址:http://spiderbuf.cn/e03/

import requests
from lxml import etree
import csv
data = []
def get_page_info(url: str) -> list:
    global data
    html = requests.get(url).text  # 获取初始页内容
    parse_html = etree.HTML(html)
    table = parse_html.xpath("//tbody//tr")  # 取所有的数据列
    for i in table:  # 循环每个数据列
        data.append(i.xpath(".//td//text()"))  # 读取每列的数据并添加到数据列表
    return data
html = requests.get("http://spiderbuf.cn/e03/").text  # 获取初始页内容
parse_html = etree.HTML(html)  # 调用方法解析html
text = parse_html.xpath('//ul[@class="pagination"]//li//a//@href')
"""
xpath解析:
//ul[@class="pagination"] 从网页根进行匹配类名为pagination的ul列表
//li 继续从上衣一步中继续匹配li元素
//a 继续从上一步中继续匹配a元素
//@href 继续从上一步取出href属性的值
"""
data.append(parse_html.xpath("//thead/tr/th/text()"))  # 取标头内容并添加到数据列表
for path in text:  # 循环列表取每页page的名称
    url = "http://spiderbuf.cn/e03/" + path  # 拼接当前page的链接
    get_page_info(url)  # 调用函数进行读取当前page下的数据
f = open("info.csv", 'w', encoding='utf-8', newline='')  # 使用w打开info.csv文件
csv = csv.writer(f)  # 创建csv对象
csv.writerows(data)  # 调用方法将文件写入csv文件内

难点:在于他的页路径不是有规律的,而是无规律的,需要使用xpath获取到每页的页索引

0

评论

博主关闭了所有页面的评论