2024-08-17



import requests
from bs4 import BeautifulSoup
import pandas as pd
 
# 设置请求头,模拟浏览器访问
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'}
 
def get_movies(url):
    # 发送GET请求
    response = requests.get(url, headers=headers)
    # 解析网页
    soup = BeautifulSoup(response.text, 'lxml')
    # 找到电影信息的列表
    movie_list = soup.find('ol', attrs={'data-items': 'movies'})
    movies = []
    # 遍历电影信息列表
    for movie in movie_list.find_all('li'):
        data = movie.find('div', class_='info')
        if data:
            movie_info = {
                '排名': movie.find('em').text,
                '电影名': data.find('div', class_='hd').find('a').text,
                '评分': data.find('div', class_='bd').find('div', class_='star').find('span', class_='rating_num').text,
                '评论数': data.find('div', class_='bd').find('p', class_='quote').text.strip()[3:-1]
            }
            movies.append(movie_info)
    return movies
 
# 主函数
def main():
    # 爬取的豆瓣电影榜单URL
    url = 'https://movie.douban.com/chart'
    # 获取电影数据
    movies = get_movies(url)
    # 将数据保存到CSV文件
    df = pd.DataFrame(movies)
    df.to_csv('douban_movies.csv', index=False, encoding='utf-8-sig')
 
if __name__ == '__main__':
    main()

这段代码实现了从豆瓣电影TOP250排行榜中爬取电影信息的功能,并将爬取的数据保存到CSV文件中。代码使用了requests库来发送HTTP请求,BeautifulSoup库来解析HTML,以及pandas库来处理和保存数据。同时,代码中加入了请求头来模拟浏览器访问,避免了反爬虫策略的阻止。

2024-08-17



import requests
from lxml import etree
import csv
import time
 
# 设置请求头,模拟浏览器访问
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'}
 
# 存储数据的列表
data_list = []
 
def get_data(url):
    response = requests.get(url, headers=headers)
    return response.text
 
def parse_data(html):
    # 使用etree.HTML解析网页,并通过Xpath选取数据
    html = etree.HTML(html)
    # 影片信息的Xpath
    movie_xpath = '//div[@class="info"]'
    # 评分的Xpath
    score_xpath = '//div[@class="star"]/span[@class="rating_num"]/text()'
    # 影片名称的Xpath
    name_xpath = '//div[@class="hd"]/a/span[1]/text()'
    # 影评人数的Xpath
    comment_xpath = '//div[@class="star"]/span[4]/text()'
 
    # 提取数据
    movies = html.xpath(movie_xpath)
    for movie in movies:
        data = {
            'ranking': movie.xpath('./div[@class="pic"]/em/text()')[0],
            'score': movie.xpath(score_xpath)[0],
            'name': movie.xpath(name_xpath)[0],
            'comment': movie.xpath(comment_xpath)[0] if movie.xpath(comment_xpath) else '0'
        }
        data_list.append(data)
 
def save_data():
    with open('douban_top250.csv', 'w', newline='', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=['ranking', 'score', 'name', 'comment'])
        writer.writeheader()
        for data in data_list:
            writer.writerow(data)
 
def main():
    # 爬取的网页URL
    url = 'https://movie.douban.com/top250'
    html = get_data(url)
    parse_data(html)
    save_data()
 
if __name__ == '__main__':
    main()

这段代码实现了从豆瓣Top250电影页面爬取数据的功能。首先,设置请求头,模拟浏览器访问,以避免反爬虫机制。然后定义了一个获取网页内容的函数get_data,一个解析网页内容的函数parse_data,以及一个保存数据到CSV文件的函数save_data。最后,在main函数中调用这些函数,完成数据爬取和保存的流程。

2024-08-17

头歌第1关的任务是编写一个能够使用多线程或多进程方式进行网络爬虫的Python程序。以下是一个简单的Python示例,使用concurrent.futures模块中的ThreadPoolExecutorProcessPoolExecutor来实现多线程或多进程爬虫。




import requests
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
 
def fetch_url(url):
    response = requests.get(url)
    return url, response.status_code
 
def main():
    # 输入的网址列表
    urls = ["http://example.com/page1", "http://example.com/page2", ...]
    
    # 使用多线程或多进程
    # with ThreadPoolExecutor(max_workers=5) as executor:  # 多线程
    with ProcessPoolExecutor(max_workers=5) as executor:  # 多进程
        future_to_url = {executor.submit(fetch_url, url): url for url in urls}
        for future in concurrent.futures.as_completed(future_to_url):
            url, status_code = future.result()
            print(f"{url} - {status_code}")
 
if __name__ == "__main__":
    main()

在这个例子中,fetch_url函数负责获取单个URL的内容。main函数中,我们创建了一个网址列表,并使用ThreadPoolExecutorProcessPoolExecutor来并发地执行这些网址的抓取。我们可以通过注释来切换使用多线程或多进程。

请注意,在实际应用中,应该对网络请求添加适当的错误处理和重试机制,以及对并发数进行适当的管理,以免被目标服务器封禁。

2024-08-17

为了基于requests进行二次开发,你需要使用requests库的功能来发送HTTP请求,并处理返回的响应。以下是一个简单的例子,展示了如何使用requests来获取一个网页的内容:




import requests
 
def fetch_url(url):
    try:
        response = requests.get(url)  # 发送GET请求
        if response.status_code == 200:  # 请求成功
            return response.text  # 返回网页内容
        else:
            return "Error: {}".format(response.status_code)
    except requests.exceptions.RequestException:
        return "Error: Network error occurred"
 
url = "http://example.com"
print(fetch_url(url))

在这个例子中,fetch_url函数接受一个URL,使用requests.get方法发送一个GET请求,然后检查响应状态码。如果状态码是200,表示请求成功,返回网页内容;如果不是,则返回错误信息。如果发生网络异常,捕获异常并返回异常信息。

这只是一个基本的例子,实际的爬虫可能需要处理更复杂的情况,比如处理Cookies、Session持久化、处理AJAX请求、反爬虫策略(如布隆过滤器、CAPTCHA等)、网页解析(使用BeautifulSoup或正则表达式等)以及并发请求等。

2024-08-17

Python爬虫作为一种能够有效获取网络数据的技术,可以用来做副业赚钱。以下是一些使用Python爬虫作为副业赚钱的方式:

  1. 数据服务:提供定制的数据抓取服务,根据需求抓取特定网站的数据。
  2. 产品创建:为在线商店或自己的网站创建产品,并使用Python爬虫自动更新库存信息。
  3. 开发自己的项目:开发自己的项目,比如一个社交媒体管理工具,可以帮助企业或个人管理社交媒体账号。
  4. 教学:分享你的爬虫技能,通过在线课程、研讨会或私人指导来教授别人。
  5. 出售数据:个人可以出售通过爬虫获取的高价值数据。
  6. 广告合作:通过在爬虫项目中添加广告或商业合作伙伴关系来赚取佣金。
  7. 创建付费爬虫工具或服务:为需要数据的人提供付费的爬虫服务。

这些方式可以根据你的技术能力、可用资源、市场需求和个人喜好来选择。

以下是一个简单的Python爬虫示例,用于抓取一个网站的商品信息并保存为CSV文件:




import requests
from bs4 import BeautifulSoup
import csv
 
url = 'http://example.com/products'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
 
products = soup.find_all('div', class_='product')
 
headers = ['Name', 'Price', 'Description']
with open('products.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(headers)
    for product in products:
        name = product.find('h3', class_='product-name').text
        price = product.find('div', class_='product-price').text
        description = product.find('div', class_='product-description').text
        writer.writerow([name, price, description])
 
print('Products data has been saved to products.csv')

请注意,爬虫应遵守法律法规,遵循网站的robots.txt规则,并尊重版权及知识产权。不应滥用爬虫技术,进行破坏性操作,或者侵犯用户隐私。

2024-08-17



import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
 
public class SimpleWebCrawler {
 
    public static void main(String[] args) throws Exception {
        String url = "http://example.com"; // 替换为你想爬取的网站
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
        connection.setRequestMethod("GET");
 
        try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
            String inputLine;
            StringBuilder content = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                content.append(inputLine);
            }
 
            // 打印网页内容
            System.out.println(content.toString());
        }
    }
}

这段代码展示了如何使用Java进行简单的网络爬虫。它创建了一个指向指定URL的HttpURLConnection,然后读取并打印了网页内容。这是一个基本的示例,实际的网络爬虫可能需要处理更复杂的情况,比如多线程下载、页面解析、链接跟踪、robots.txt遵守等。

2024-08-17



// 假设我们已经有了一个加密的函数定义,例如:
var encryptedFunction = "function(t, e, r, i, n, a, o) { ... }";
 
// 使用正则表达式提取参数名
var params = encryptedFunction.match(/^function\s*[^(]*<span class="katex">\(\s*([^)]*)\)</span>/m)[1].replace(/\s+/g, '').split(',');
 
// 构造函数体
var funcBody = encryptedFunction.replace(/^function\s*[^(]*<span class="katex">\(\s*([^)]*)\)</span>\s*{/, '').slice(0, -1);
 
// 将参数和函数体结合,构造新的函数
var newFunction = new Function(params.join(', '), funcBody);
 
// 使用新函数
var result = newFunction(/* 参数 */);

这段代码展示了如何将一个加密的函数转换为可调用的JavaScript函数。它使用正则表达式来解析函数定义,并通过new Function动态构造了一个新的函数。在实际应用中,你需要根据具体的加密函数来调整正则表达式以正确解析函数定义。

2024-08-17



<?php
// 初始化HTTP客户端
$httpClient = new Snoopy\Snoopy();
 
// 设置请求的URL
$url = 'http://www.baidu.com/s?wd=ip';
 
// 发送请求
$httpClient->fetch($url);
 
// 检查是否有错误
if (!$httpClient->error) {
    // 获取响应的HTML内容
    $content = $httpClient->results;
 
    // 使用正则表达式匹配所需数据
    preg_match_all('/<a href="(.*?)" target="_blank" class="">(.*?)<\/a>/i', $content, $matches);
 
    // 提取URL和标题
    $urls = $matches[1];
    $titles = $matches[2];
 
    // 输出结果
    foreach ($urls as $index => $url) {
        echo "标题: " . $titles[$index] . "\n";
        echo "URL: " . $url . "\n";
        echo "------------------------------\n";
    }
} else {
    // 输出错误信息
    echo "错误: " . $httpClient->error . "\n";
}

这段代码使用了Snoopy库来发送HTTP请求,并使用正则表达式来提取搜索结果中的URL和标题。这个例子简单直观地展示了如何使用PHP进行基本的网络爬虫操作。

2024-08-17



# 设置Docker环境变量
export DOCKER_IP=你的Docker机器IP
export REMOTE_HOSTS=$DOCKER_IP:1099
 
# 启动JMeter容器
docker run -d --name jmeter-server -e SERVER_PORT=1099 -p 1099-1099 jmeter-server
 
# 运行压测
docker exec -t jmeter-load-generator /opt/apache-jmeter-5.4/bin/jmeter -n -t /load-test.jmx -R $REMOTE_HOSTS -l /tmp/result.jtl
 
# 获取压测结果
docker cp jmeter-server:/tmp/result.jtl ./result.jtl

这个例子展示了如何在Docker环境中设置JMeter容器作为服务器,并使用一个简单的压测脚本load-test.jmx来进行分布式测试。压测结果将被保存并复制到本地。这是一个标准的压测流程,适合于需要快速配置和执行分布式性能测试的开发者。

2024-08-17

ZAP(ZAProxy)是一款非常受欢迎的开源安全测试工具,它能够帮助我们进行自动化的安全测试,包括渗透测试和网站漏洞扫描。

在Kali Linux中,我们可以使用ZAP进行自动化的网站渗透测试。以下是一些常见的使用场景:

  1. 主动扫描:主动扫描可以帮助我们发现更多的安全问题,比如XSS、SQL注入、越权等问题。
  2. 被动扫描:被动扫描可以帮助我们分析和学习web应用的行为,不会对web应用造成干扰。

下面是一个使用ZAP进行被动扫描的Python脚本示例:




# 导入必要的库
from zapv2 import ZAPv2
import time
 
# 初始化ZAP客户端
api_key = 'change_me'
zap = ZAPv2(api_key=api_key)
 
# 设置ZAP代理,开始监听
zap.spider.set_option_spider_handle_anti_robots(False)
zap.spider.set_option_thread_max(10)
zap.spider.set_option_host_per_scan(1)
 
# 设置被动扫描的技术
zap.pscan.set_option_app_unlink(False)
zap.pscan.set_option_enable_jsonp(True)
 
# 启动ZAP扫描器
zap.spider.scan('http://www.example.com')
 
# 等待直到扫描完成
while(int(zap.spider.status()) < 100):
    print('Spider progress: ' + str(zap.spider.status()))
    time.sleep(5)
 
# 启动主动扫描
zap.pscan.scan('http://www.example.com')
 
# 等待直到扫描完成
while(int(zap.pscan.status()) < 100):
    print('Passive scan progress: ' + str(zap.pscan.status()))
    time.sleep(5)
 
# 获取扫描结果
print('Scanning complete')
issues = zap.core.alerts()
for issue in issues:
    print('Risk: ' + issue['risk'])
    print('Issue: ' + issue['alert'])
    print('URL: ' + issue['url'])
 
# 清理工作
zap.core.shutdown()

在这个脚本中,我们首先初始化了ZAP客户端,然后设置了ZAP的一些选项,比如是否允许爬取反反爬虫策略的页面,最大线程数,每次扫描的主机数等。然后我们开始进行爬虫和渗透测试,等待扫描完成后,我们获取扫描结果,并打印出每个问题的风险级别、问题描述和URL。最后,我们进行一些清理工作,关闭ZAP。

这只是ZAP功能的一个简单的展示,ZAP的功能远不止这些,它还可以进行自定义脚本的编写,进行更复杂的渗透测试。