2024-08-21



import requests
import json
import time
 
# 请求头部信息,模拟浏览器访问
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'X-Requested-With': 'XMLHttpRequest',
}
 
# 视频ID
video_id = 'f8c487c05f613c43b9b5f148f36b8744'
 
# 初始化session,保持会话
session = requests.Session()
 
# 分页参数
page = 1
page_size = 20
 
# 存储评论的列表
comments = []
 
# 循环抓取评论,直到没有更多评论
while True:
    # 构建Ajax请求的URL
    url = f'https://video.coral.qq.com/varticle/935582928/comment/v2?video_id={video_id}&tid=0&pid=0&source=1&comment_id=0&score=0&size={page_size}&cursor=&order=0&platform=11&is_jsonp=false&callback=_varticle935582928commentv2'
    
    # 发送请求
    response = session.get(url, headers=headers)
    
    # 解析JSON数据
    data = json.loads(response.text.lstrip('_varticle935582928commentv2(').rstrip(');'))
    
    # 检查是否有新的评论数据
    if data['data']['cursor']['has_next']:
        # 更新分页参数
        cursor = data['data']['cursor']['next']
        page += 1
    else:
        # 没有更多评论,退出循环
        break
    
    # 将评论内容存储到列表中
    comments.extend([comment['content'] for comment in data['data']['comments']])
    
    # 防止被限流,设置每次请求间隔
    time.sleep(2)
 
# 打印抓取到的评论内容
for comment in comments:
    print(comment)

这段代码使用了requests库来模拟发送HTTP请求,并使用json库来解析JSON响应。通过循环抓取腾讯视频的评论,直至没有更多评论为止。每次请求都设置了合适的headers,以模拟浏览器访问,并且在每次请求之间有2秒的间隔,以防止触发防爬机制。最后,打印出抓取的评论内容。

2024-08-21

由于原代码较长,以下是核心函数的示例:




import requests
import json
from pymongo import MongoClient
 
# 连接MongoDB
client = MongoClient('mongodb://localhost:27017/')
db = client['movie_database']
collection = db['movies']
 
# 发送Ajax请求获取数据
def fetch_movies(url):
    response = requests.get(url)
    if response.status_code == 200:
        data = json.loads(response.text)
        return data['data']['movies']
    else:
        return []
 
# 解析数据并存储到MongoDB
def save_to_mongo(movies):
    for movie in movies:
        collection.insert_one(movie)
 
# 主函数
def main():
    # 请求URL模板
    url_template = 'http://api.example.com/movies?start={}&count=20'
    # 循环获取数据并保存
    for start in range(0, 100, 20):
        url = url_template.format(start)
        movies = fetch_movies(url)
        save_to_mongo(movies)
 
if __name__ == '__main__':
    main()

这段代码展示了如何使用Python发送HTTP GET请求来获取Ajax动态加载的数据,并将其存储到MongoDB数据库中。注意,示例中的URL和数据结构只是模拟的,实际应用中需要替换为正确的API端点和数据处理逻辑。

2024-08-21

题目描述:给定一个有序整数数组,编写一个函数查找特定的目标值,如果目标值存在返回其索引,否则返回 -1。

解决方案:

  1. Java 实现:



public class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return -1;
    }
}
  1. Python 实现:



class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = left + (right - left) // 2
            if nums[mid] == target:
                return mid
            elif nums[mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        return -1
  1. C++ 实现:



class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return -1;
    }
};
  1. JavaScript 实现:



function search(nums, target) {
    let left = 0;
    let right = nums.length - 1;
    while (left <= right) {
        let mid = Math.floor((left + right) / 2);
        if (nums[mid] === target) {
            return mid;
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1;
}

以上代码实现了使用二分查找算法在有序数组中查找特定目标值的功能。如果找到目标值,则返回其索引,否则返回 -1。

2024-08-21

题目描述:

给定一个IP地址,请返回其所在的城市名。若IP地址不存在,则返回"Not found"。

输入描述:

输入为一个字符串,格式为IPv4地址,如"192.168.1.1"。

输出描述:

输出为一个字符串,表示该IP地址对应的城市名。

示例:




输入:"192.168.1.1"
输出:"北京"

解决方案:

这个问题可以通过查找IP地址与城市之间的映射关系来解决。在实际应用中,通常会有一个庞大的数据库来存储IP范围与对应城市的映射关系,这个数据库可以是IP数据库或者地理位置数据库。

以下是一个简单的Python示例,使用了一个静态字典来模拟这个数据库,实际应用中应该替换为查询外部数据库或者使用API的方式。




# 模拟IP到城市的映射
ip_city_mapping = {
    "192.168.1.1": "北京",
    "192.168.1.2": "上海",
    # ... 其他IP地址与城市的映射
}
 
def find_city_by_ip(ip):
    return ip_city_mapping.get(ip) or "Not found"
 
# 示例用法
ip = "192.168.1.1"
city = find_city_by_ip(ip)
print(city)  # 输出:北京

在实际应用中,这个映射关系应该来自于专业的IP地址数据库或者第三方的地理位置服务,并且应该有更高效的查询机制。如果没有现成的数据库或服务,可能需要编写或使用外部库来解析IP地址,然后查询相关的地理位置数据库。

2024-08-21

题目:给你一个字符串 s ,请你返回 s 中最长的满足如下条件的子字符串的长度:每个元音字母在子字符串中的出现次数都是偶数。

元音字母包括 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'

示例 1:

输入:s = "eleetminicoworoep"

输出:13

解释:子字符串是 "minicowor" ,它包含 'a','e','i','o' 各 2 个,总共 8 个元音字母,满足每个元音字母出现次数都是偶数。

示例 2:

输入:s = "leetcodeisgreat"

输出:5

解释:子字符串是 "leetc" ,它包含 'e' 和 'i' 各 2 个,满足每个元音字母出现次数都是偶数。

示例 3:

输入:s = "bcbcbc"

输出:0

解释:没有子字符串满足条件,因此返回 0 。

提示:

  • 1 <= s.length <= 10^5
  • s 只包含小写或大写英文字母。

Java 解法:




class Solution {
    public int findTheLongestSubstringWithEvenNumberOfVowels(String s) {
        int ans = 0, count = 0;
        boolean[] vowel = new boolean[52];
        for (int i = 0; i < 26; i++) {
            vowel['a' + i] = true;
            vowel['A' + i] = true;
        }
        int[] last = new int[1];
        for (int i = 0; i < s.length(); i++) {
            if (vowel[s.charAt(i)]) {
                count++;
            }
            while (count > 1 && i - last[0] > 0) {
                if (vowel[s.charAt(last[0])]) {
                    count--;
                }
                last[0]++;
            }
            ans = Math.max(ans, i - last[0] + 1);
        }
        return ans;
    }
}

JavaScript 解法:




var findTheLongestSubstringWithEvenNumberOfVowels = function(s) {
    let ans = 0, count = 0;
    const vowel = new Set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']);
    let last = -1;
    for (let i = 0; i < s.length; i++) {
        if (vowel.has(s[i])) {
            count++;
        }
        while (count > 1 && i - last > 0) {
            if (vowel.has(s[last + 1])) {
                count--;
            }
            last++;
        }
        ans = Math.max(ans, i - last);
    }
    return ans;
};

Python 解法:




class Solution:
    def findTheLongestSubstringWithEvenNumberOfVowels(self, s: str) -> int:
        ans = 0
        count = 0
        vowel = set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'])
        last = -1
        for i in range(len(s)):
            if s[i] in vowel:
                count += 1
            while count > 1 and i - last > 0:
                if s[last + 1] in vowel:
                    count -= 1
                last += 1
            ans = max(ans, i - last)
        return ans

C 解法:




#
2024-08-21

题目描述:

给定一个IP地址,需要查询并返回该IP所在的城市。

解决方案:

这个问题可以通过查找IP地址的地理位置数据库来解决。可以使用在线API服务或者数据库文件。

以下是使用在线API服务的Java、JavaScript、Python和C/C++的示例代码。

Java示例(使用在线API):




import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
 
public class IPLookup {
    public static void main(String[] args) throws Exception {
        String ip = "123.123.123.123"; // 示例IP地址
        String apiUrl = "http://ip-api.com/json/" + ip;
 
        URL url = new URL(apiUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
 
        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String inputLine;
        StringBuilder content = new StringBuilder();
 
        while ((inputLine = in.readLine()) != null) {
            content.append(inputLine);
        }
        in.close();
 
        // 解析JSON结果
        String city = parseCityFromJson(content.toString());
        System.out.println("City: " + city);
    }
 
    private static String parseCityFromJson(String json) {
        // 这里简化处理,实际应该解析JSON字符串
        return "CityName"; // 返回城市名
    }
}

JavaScript示例(使用在线API):




const https = require('https');
 
function getCityByIP(ip) {
    return new Promise((resolve, reject) => {
        const apiUrl = `http://ip-api.com/json/${ip}`;
        https.get(apiUrl, (res) => {
            let data = '';
 
            res.on('data', (chunk) => {
                data += chunk;
            });
 
            res.on('end', () => {
                try {
                    const city = JSON.parse(data).city; // 假设结构是 {... "city": "CityName", ...}
                    resolve(city);
                } catch (error) {
                    reject(error);
                }
            });
        }).on('error', (e) => {
            reject(e);
        });
    });
}
 
// 使用示例
getCityByIP('123.123.123.123').then(city => console.log(city));

Python示例(使用在线API):




import requests
 
def get_city_by_ip(ip):
    api_url = f"http://ip-api.com/json/{ip}"
    response = requests.get(api_url).json()
    return response.get('city')
 
# 使用示例
ip = '123.123.123.123'
city = get_city_by_ip(ip)
print(city)

C/C++示例(不考虑,因为直接在程序中处理IP查询可能涉及到复杂的本地数据库或者大量的网络请求,不符合OD机试的要求):

2024-08-21

题目描述:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:




给定 nums = [2, 7, 11, 15], target = 9
 
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解法1:暴力法(Java)




class Solution {
    public int[] twoSum(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] == target - nums[i]) {
                    return new int[]{i, j};
                }
            }
        }
        return new int[0];
    }
}

解法2:哈希表(Java)




class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (map.containsKey(complement)) {
                return new int[]{map.get(complement), i};
            }
            map.put(nums[i], i);
        }
        return new int[0];
    }
}

解法3:JavaScript 版本的哈希表




/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let map = new Map();
    for (let i = 0; i < nums.length; i++) {
        let complement = target - nums[i];
        if (map.has(complement)) {
            return [map.get(complement), i];
        }
        map.set(nums[i], i);
    }
    return [];
};

解法4:Python 版本的哈希表




class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        map = {}
        for i, num in enumerate(nums):
            complement = target - num
            if complement in map:
                return [map[complement], i]
            map[num] = i
        return []

解法5:C 语言版本的哈希表




#include <stdbool.h>
#include <stdlib.h>
 
bool cmp(const void *a, const void *b) {
    return *(int*)a - *(int*)b;😩抱歉,出了点小问题,请稍后重试
2024-08-21



from playwright.async_api import async_playwright
 
async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
 
        # 注入自定义JavaScript以隐藏浏览器指纹特征
        await page.evaluate(hide_fingerprint_features_js)
 
        # 其他页面操作...
 
        await browser.close()
 
# 确保你已经定义了hide_fingerprint_features_js字符串,它包含隐藏浏览器指纹特征的JavaScript代码
if __name__ == '__main__':
    import asyncio
    asyncio.run(main())

在这个例子中,我们使用了async with结构来处理异步操作,这样可以确保在操作完成后浏览器会正确关闭。我们还使用了await page.evaluate()来在页面上执行隐藏浏览器指纹特征的JavaScript代码。这段代码假设hide_fingerprint_features_js是一个包含隐藏特性的JavaScript代码的字符串,它在全局范围内被定义和可用。

2024-08-21

题目描述:

给定一个正整数n,生成一个包含1到n^2的数字的矩阵,矩阵的排列规则如下:

从左上角开始,以顺时针螺旋方式进行填充。

示例:

输入:n = 3

输出:

[[1, 2, 3],

[8, 9, 4],

[7, 6, 5]]

解决方案:

这个问题可以通过模拟螺旋矩阵生成的过程来解决。以下是使用Java、JavaScript、Python和C/C++实现的解决方案。

Java 实现:




class Solution {
    public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        int start = 0;
        int count = 1;
        int loop = n / 2;
 
        while (loop-- > 0) {
            int endX = n - 1 - start;
            int endY = n - 1 - start;
 
            // 上行
            for (int i = start; i <= endX; i++) {
                matrix[start][i] = count++;
            }
 
            // 右列
            for (int i = start; i <= endY; i++) {
                matrix[i][endX] = count++;
            }
 
            // 下行
            for (int i = endX; i >= start && endY != start; i--) {
                matrix[endY][i] = count++;
            }
 
            // 左列
            for (int i = endY; i >= start && endX != start; i--) {
                matrix[i][start] = count++;
            }
 
            start++;
        }
 
        if (n % 2 == 1) {
            matrix[start][start] = count;
        }
 
        return matrix;
    }
}

JavaScript 实现:




function generateMatrix(n) {
    let matrix = new Array(n).fill(0).map(() => new Array(n).fill(0));
    let start = 0;
    let count = 1;
    let loop = n / 2 | 0;
 
    while (loop--) {
        let endX = n - 1 - start;
        let endY = n - 1 - start;
 
        // 上行
        for (let i = start; i <= endX; i++) {
            matrix[start][i] = count++;
        }
 
        // 右列
        for (let i = start; i <= endY; i++) {
            matrix[i][endX] = count++;
        }
 
        // 下行
        for (let i = endX; i >= start && endY != start; i--) {
            matrix[endY][i] = count++;
        }
 
        // 左列
        for (let i = endY; i >= start && endX != start; i--) {
            matrix[i][start] = count++;
        }
 
        start++;
    }
 
    if (n 
2024-08-20

lxml是一个Python库,用于处理XML和HTML。它提供了一个强大且灵活的API,可以用来解析、修改以及创建XML和HTML数据。

以下是一个使用lxml库解析HTML并提取链接的简单示例:




from lxml import html
import requests
 
# 获取HTML内容
url = 'https://www.example.com'
r = requests.get(url)
r.raise_for_status()  # 检查请求是否成功
 
# 解析HTML
tree = html.fromstring(r.text)
 
# 使用XPath选择所有的a标签,并提取href属性
links = tree.xpath('//a/@href')
 
# 打印链接
for link in links:
    print(link)

这段代码首先导入了lxml的html模块和requests模块。然后,使用requests库获取网页内容,并检查请求是否成功。接下来,使用html.fromstring()函数将HTML文本解析成一个可以进行XPath查询的对象。最后,使用XPath表达式选取所有a标签的href属性,即网页中的所有链接,并打印出来。