2024-08-19



import requests
from requests_html import HTMLSession
 
# 创建一个HTMLSession对象,以便使用持久的Cookies和Keep-Alive
session = HTMLSession()
 
# 指定要抓取的URL
url = 'http://example.com/'
 
# 使用get方法发送请求
response = session.get(url)
 
# 检查响应状态
if response.status_code == 200:
    # 打印网页的title
    print(response.html.title)
    
    # 找到所有的链接并打印
    for link in response.html.links:
        print(link)
        
    # 找到所有的图片链接并打印
    for image in response.html.images:
        print(image)
        
    # 使用.find方法找到特定的元素
    container = response.html.find('#container', first=True)
    print(container.text)
    
    # 使用.render方法渲染完整的网页
    response.html.render()
    
    # 保存渲染后的网页到文件
    response.html.save('example.com.html')
else:
    print('Failed to retrieve the webpage')
 
# 清理工作,关闭会话
session.close()

这段代码展示了如何使用requests-html库来抓取一个简单的网页,并提取其中的标题、链接和图片,同时还演示了如何渲染和保存网页。这个库提供了许多便捷的方法来处理HTML内容,使得网络爬虫的开发更加简便和高效。

2024-08-19

在Python中使用Selenium定位元素时,可以使用CSS选择器来精确找到页面上的元素。CSS选择器是一种强大的工具,可以通过元素的ID、类、属性等来选择页面元素。

以下是使用CSS选择器定位元素的示例代码:




from selenium import webdriver
 
# 启动浏览器驱动
driver = webdriver.Chrome()
 
# 打开网页
driver.get("http://example.com")
 
# 使用CSS选择器定位元素
element = driver.find_element_by_css_selector("#loginForm input[type='password']")
 
# 输入密码
element.send_keys("your_password")
 
# 关闭浏览器驱动
driver.quit()

在这个例子中,我们使用了一个CSS选择器来定位一个登录表单中的密码输入框。选择器是根据元素的ID(loginForm)和属性(type='password')来确定的。这种方法使得定位元素更加灵活和精确,特别适合于处理动态内容和复杂的页面布局。

2024-08-19

在Python中,可以使用requests库来处理AJAX请求。以下是一个简单的例子,展示如何抓取一个使用AJAX加载内容的网页:




import requests
import json
 
# 目标URL,通常是AJAX请求的目标地址
url = 'http://example.com/api/data'
 
# 如果需要的话,添加AJAX请求的参数
params = {
    'param1': 'value1',
    'param2': 'value2'
}
 
# 发送GET请求
response = requests.get(url, params=params)
 
# 假设返回的是JSON数据
data = response.json()
 
# 处理数据
for item in data:
    print(item)

注意:

  1. 替换http://example.com/api/data为实际的AJAX请求地址。
  2. 如果需要,添加请求头(headers)以模拟浏览器。
  3. 根据服务器响应的数据格式(如JSON, XML等),选择合适的解析方式。
  4. 处理可能出现的反爬机制,如需要登录验证、Cookies传递等。

如果网站使用的是POST请求而不是GET请求,并且需要携带数据,可以这样做:




# 发送POST请求
response = requests.post(url, data=params)

如果AJAX请求需要处理复杂的情况,如Cookies、Session管理、代理等,可以进一步扩展代码,以满足特定需求。

2024-08-19

题目描述:

给定一个学生信息列表,每个学生信息由姓名和身高组成。要找到身高最接近的小友。如果有多对小友身高相同,则输出字典序最小的一对。

输入描述:

学生信息列表,每个学生信息由姓名和身高组成,姓名和身高由空格分隔,学生信息由换行分隔。

输出描述:

找到身高最接近的小友的信息,姓名和身高之间用空格分隔。

示例输入:

Bob 120

Alice 130

Jane 110

示例输出:

Jane 110 Bob 120

解决方案:

Java 代码实现:




import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<Student> students = new ArrayList<>();
        while (scanner.hasNextLine()) {
            String[] info = scanner.nextLine().split(" ");
            students.add(new Student(info[0], Integer.parseInt(info[1])));
        }
        Student[] closestFriends = findClosestFriends(students);
        System.out.println(closestFriends[0].name + " " + closestFriends[0].height + " " + closestFriends[1].name + " " + closestFriends[1].height);
    }
 
    private static Student[] findClosestFriends(List<Student> students) {
        students.sort(Comparator.comparingInt(s -> s.height));
        int minDiff = Integer.MAX_VALUE;
        Student[] closest = new Student[2];
        for (int i = 1; i < students.size(); i++) {
            int diff = Math.abs(students.get(i).height - students.get(i - 1).height);
            if (diff < minDiff) {
                minDiff = diff;
                closest[0] = students.get(i - 1);
                closest[1] = students.get(i);
            }
        }
        return closest;
    }
 
    static class Student {
        String name;
        int height;
 
        public Student(String name, int height) {
            this.name = name;
            this.height = height;
        }
    }
}

Python 代码实现:




import sys
 
def find_closest_friends(students):
    students.sort(key=lambda s: s.height)
    min_diff = sys.maxsize
    closest = [None, None]
    for i in range(1, len(students)):
        diff = abs(students[i].height - students[i - 1].height)
        if diff < min_diff:
            min_diff = diff
            closest[0] = students[i - 1]
            closest[1] = students[i]
    return closest
 
class Student:
    def __init__(self, name, height):
        self.name = name
        self.height = height
 
if __name__ == "__main__":
    students = []
    for line in sys.stdin:
        name, height = line.split()
        students.append(Student(name, int(height)))
    closest_friends = find_closest_friends(students)
    print(f"{closest_friends[0].name} {
2024-08-19

题目描述:

给定一个正整数 n ,请找出跳格子的方式数,跳格子的规则是每次只能跳至正向的下一个格子,或是跳至负向的下一个格子。

输入描述:

输入一个正整数 n

输出描述:

输出跳格子的方式数

解决方案:

这是一个典型的动态规划问题。我们可以定义一个数组 dp ,其中 dp[i] 表示到达格子 i 的方式数。初始时,dp 数组中的所有元素都初始化为0。

动态规划的状态转移方程为:

  • 如果 i 是偶数,那么 dp[i] = dp[i - 1] + dp[i / 2],表示可以从 i - 1 直接跳到 i,或者从 i / 2 经过一次跳跃后到达 i。
  • 如果 i 是奇数,那么 dp[i] = dp[i - 1],表示因为只能跳至正向的下一个格子或负向的下一个格子,所以无论如何我们都不能到达奇数位置的格子。

以下是各种语言的实现:

Java 实现:




public class Main {
    public static void main(String[] args) {
        int n = 5; // 示例输入
        System.out.println(jumpFloor(n));
    }
 
    public static int jumpFloor(int target) {
        if (target <= 0) {
            return 0;
        }
        int[] dp = new int[target + 1];
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= target; i++) {
            if (i % 2 == 0) {
                dp[i] = dp[i - 1] + dp[i / 2];
            } else {
                dp[i] = dp[i - 1];
            }
        }
        return dp[target];
    }
}

Python 实现:




def jumpFloor(target):
    dp = [0] * (target + 1)
    dp[0], dp[1] = 0, 1
    for i in range(2, target + 1):
        if i % 2 == 0:
            dp[i] = dp[i - 1] + dp[i // 2]
        else:
            dp[i] = dp[i - 1]
    return dp[target]
 
print(jumpFloor(5))  # 示例输出

C++ 实现:




#include <iostream>
#include <vector>
 
using namespace std;
 
int jumpFloor(int target) {
    vector<int> dp(target + 1, 0);
    dp[0] = 0;
    dp[1] = 1;
    for (int i = 2; i <= target; i++) {
        if (i % 2 == 0) {
            dp[i] = dp[i - 1] + dp[i / 2];
        } else {
            dp[i] = dp[i - 1];
        }
    }
    return dp[target];
}
 
int main() {
    int n;
    cin >> n;
    cout << jumpFloor(n) << endl;
    return 0;
}

JavaScript 实现:




function jumpFloor(target) {
    let dp = new Array(target + 1).fill(0);
    dp[0] = 0;
    dp[1] = 1;
    for (let i = 2; i <= target; i++) {
        if (i % 2 === 0) {
2024-08-18



import unittest
from selenium import webdriver
from time import sleep
from HTMLTestRunner import HTMLTestRunner
 
class TestUntitled(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.base_url = "http://www.google.com/"
        self.verificationErrors = []
        self.accept_next_alert = True
 
    def test_untitled(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_id("lst-ib").click()
        driver.find_element_by_id("lst-ib").clear()
        driver.find_element_by_id("lst-ib").send_keys("Selenium")
        driver.find_element_by_name("btnK").click()
 
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True
 
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to.alert()
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert.text
        finally: self.accept_next_alert = True
 
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)
 
def suite():
    suite = unittest.TestSuite()
    suite.addTest(TestUntitled("test_untitled"))
    return suite
 
if __name__ == "__main__":
    runner = unittest.TextTestRunner()
    runner.run(suite())
 
    with open('test_report.html', 'wb') as f:
        runner = HTMLTestRunner(stream=f, title='Google Search Test', description='Test case for Google Search')
        runner.run(suite())

这段代码修复了原代码中的一些问题,并添加了HTMLTestRunner来生成测试报告。在测试用例中,我们打开Google首页,点击搜索框,清除默认文本并输入“Selenium”,然后点击搜索按钮。在测试结束后,我们使用HTMLTestRunner生成了一个HTML格式的测试报告。这个报告将被保存为test_report.html文件。

2024-08-18

以下是一个简单的Python爬虫示例,用于爬取微博热搜数据,并保存为HTML格式文件:




import requests
from bs4 import BeautifulSoup
 
# 设置请求头,模拟浏览器访问
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
 
# 微博热搜索页面URL
url = 'https://s.weibo.com/top/summary'
 
# 发送GET请求
response = requests.get(url, headers=headers)
 
# 检查请求是否成功
if response.status_code == 200:
    # 使用BeautifulSoup解析响应内容
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 找到包含热搜数据的HTML元素
    hot_search_items = soup.find_all('div', class_='td')
    
    # 创建一个空的字符串用于存储HTML内容
    html_content = ''
    
    # 遍历所有热搜数据,构建HTML格式
    for item in hot_search_items:
        # 提取热搜词汇和指定内容
        hot_search_content = item.find('a').text
        hot_search_href = item.find('a')['href']
        hot_search_count = item.find_all('span')[1].text.strip()
        
        # 构建HTML字符串
        html_content += f'<div><a href="{hot_search_href}">{hot_search_content}</a> {hot_search_count}</div>'
    
    # 保存HTML内容到文件
    with open('weibo_hot_search.html', 'w', encoding='utf-8') as file:
        file.write(html_content)
        print('HTML文件已保存。')
else:
    print('请求失败')

这段代码首先设置了请求头,以模拟浏览器访问,然后发送GET请求到微博热搜页面。成功获取页面内容后,使用BeautifulSoup解析页面,提取热搜数据,并构建HTML格式。最后,将这些数据保存到一个HTML文件中。这个过程展示了如何使用Python爬取网页数据并进行简单的数据处理,是学习网络爬虫的一个基本入门示例。

2024-08-18

在Python爬虫技术第14节中,我们通常会使用BeautifulSoup库来解析HTML结构。以下是一个简单的例子,展示了如何使用BeautifulSoup来查找和提取HTML元素。




from bs4 import BeautifulSoup
 
# 假设我们有以下HTML内容
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<div class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</div>
<p class="story">...</p>
"""
 
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(html_doc, 'html.parser')
 
# 查找所有的<a>标签
for link in soup.find_all('a'):
    print(link.get('href'))
 
# 查找id为"link3"的<a>标签
link3 = soup.find(id='link3')
print(link3.get('href'))
 
# 查找所有class为"sister"的<a>标签的链接文字
for sister in soup.find_all('a', class_='sister'):
    print(sister.get_text())

这段代码首先导入了BeautifulSoup类,然后使用一个HTML字符串初始化了一个BeautifulSoup对象。接下来,我们使用find_all方法查找所有的<a>标签,并打印它们的href属性。我们也找到了id为link3<a>标签,并打印了它的href属性。最后,我们遍历所有class为sister<a>标签,打印它们的文本内容。这个例子展示了如何使用BeautifulSoup来进行基本的HTML结构解析和数据提取。

2024-08-18



import requests
from bs4 import BeautifulSoup
 
def get_html(url):
    """
    获取网页的HTML内容
    :param url: 网页的URL
    :return: HTML内容
    """
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        else:
            return None
    except requests.RequestException:
        return None
 
def parse_html(html):
    """
    解析HTML内容,提取博客标题和链接
    :param html: HTML内容
    :return: 博客标题和链接的字典
    """
    soup = BeautifulSoup(html, 'html.parser')
    articles = soup.find_all('article', class_='post')
    blogs = []
    for article in articles:
        blog = {
            'title': article.h2.a.text.strip(),
            'link': article.h2.a['href']
        }
        blogs.append(blog)
    return blogs
 
def save_to_file(blogs, file_path):
    """
    将博客数据保存到文件
    :param blogs: 博客数据列表
    :param file_path: 文件路径
    :return: None
    """
    with open(file_path, 'w', encoding='utf-8') as file:
        for blog in blogs:
            file.write(f"标题: {blog['title']}, 链接: {blog['link']}\n")
 
def main():
    url = 'https://blog.csdn.net/weixin_43941079'
    html = get_html(url)
    if html:
        blogs = parse_html(html)
        save_to_file(blogs, 'csdn_blogs.txt')
        print("爬取成功,结果已保存到 csdn_blogs.txt 文件。")
    else:
        print("网页获取失败。")
 
if __name__ == '__main__':
    main()

这段代码实现了从CDSN博客主页获取博客列表的功能,并将结果保存到文本文件中。代码中定义了获取HTML内容、解析HTML和保存数据到文件的函数,并在main函数中调用它们。使用了requests库来获取网页内容,BeautifulSoup来解析HTML,以及Python的文件操作来保存数据。

2024-08-18

题目描述:

给定一个由无符号整数组成的数组,数组中的值构成一个数字流。写一个函数,如果数字流中存在连续的三个数值,它们的和为0,则返回true。

解决方案:

这个问题可以通过遍历数组并检查每三个连续的数值来解决。如果它们的和为0,则返回true。否则,继续遍历直到找到一组符合条件的数值或遍历结束。

以下是各种语言的解决方案:

Java:




public class Main {
    public static void main(String[] args) {
        int[] data = {1, -2, 3, -4, 5};
        System.out.println(containsZeroSumTriplet(data));
    }
 
    public static boolean containsZeroSumTriplet(int[] data) {
        for (int i = 0; i < data.length - 2; i++) {
            for (int j = i + 1; j < data.length - 1; j++) {
                if ((data[i] + data[j] + data[j + 1]) == 0) {
                    return true;
                }
            }
        }
        return false;
    }
}

JavaScript:




function containsZeroSumTriplet(data) {
    for (let i = 0; i < data.length - 2; i++) {
        for (let j = i + 1; j < data.length - 1; j++) {
            if ((data[i] + data[j] + data[j + 1]) === 0) {
                return true;
            }
        }
    }
    return false;
}
 
let data = [1, -2, 3, -4, 5];
console.log(containsZeroSumTriplet(data));

Python:




def contains_zero_sum_triplet(data):
    for i in range(len(data) - 2):
        for j in range(i + 1, len(data) - 1):
            if data[i] + data[j] + data[j + 1] == 0:
                return True
    return False
 
data = [1, -2, 3, -4, 5]
print(contains_zero_sum_triplet(data))

C:




#include <stdio.h>
 
int containsZeroSumTriplet(int data[], int length) {
    for (int i = 0; i < length - 2; i++) {
        for (int j = i + 1; j < length - 1; j++) {
            if (data[i] + data[j] + data[j + 1] == 0) {
                return 1;
            }
        }
    }
    return 0;
}
 
int main() {
    int data[] = {1, -2, 3, -4, 5};
    printf("%d\n", containsZeroSumTriplet(data, 5));
    return 0;
}

C++:




#include <iostream>
#include <vector>
 
bool containsZeroSumTriplet(const std::vector<int>& data) {
    for (size_t i = 0; i < data.size() - 2; i++) {
        for (size_t j = i + 1; j < data.size() - 1; j++) {
            if ((data[i] + data[j] + data[j + 1]) == 0) {
                return