2024-08-14



import requests
from bs4 import BeautifulSoup
import pandas as pd
 
# 房价数据爬取函数
def get_data(url):
    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'}
    res = requests.get(url, headers=headers)
    res.raise_for_status()
    soup = BeautifulSoup(res.text, 'lxml')
    return soup
 
# 解析数据函数
def parse_data(soup):
    data_list = []
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):  # 确保 tr 是一个标签
            tds = tr('td')
            data_list.append([tds[0].text, tds[1].text, tds[3].text])
    return data_list
 
# 保存数据到CSV
def save_to_csv(data_list, csv_file):
    df = pd.DataFrame(data_list, columns=['区域', '房源', '单价'])
    df.to_csv(csv_file, index=False, encoding='utf-8-sig')
 
# 主函数
def main(url, csv_file):
    soup = get_data(url)
    data_list = parse_data(soup)
    save_to_csv(data_list, csv_file)
 
if __name__ == '__main__':
    url = 'https://hz.lianjia.com/ershoufang/'
    csv_file = 'ershoufang.csv'
    main(url, csv_file)

这段代码实现了一个简单的房价数据爬取工具,它从某个房产交易网站爬取数据,解析页面中的表格数据,并将其保存到CSV文件中。代码使用了requests库来发送HTTP请求,BeautifulSoup库来解析HTML,以及pandas库来处理和保存数据。这个例子教会了如何组织代码,进行模块化设计,并且展示了如何应对简单的反爬虫策略。

2024-08-14



import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
 
# 设置代理服务器
proxies = {
    'http': 'http://12.34.56.79:8070',
    'https': 'http://12.34.56.79:8070',
}
 
def get_lyrics(url):
    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'}
    res = requests.get(url, headers=headers, proxies=proxies)
    res.encoding = 'utf-8'
    soup = BeautifulSoup(res.text, 'lxml')
    # 歌词通常在<div class="lyric-content">...</div>中
    lyric_content = soup.find('div', class_='lyric-content')
    if lyric_content:
        lyrics = lyric_content.get_text()
        # 清理多余的字符
        lyrics = re.sub(r'
<div class="katex-block">\[.*?\]</div>
', '', lyrics)
        return lyrics
    return '未找到歌词'
 
def main():
    df = pd.read_csv('music_data.csv', encoding='utf-8')
    for index, row in df.iterrows():
        url = row['url']
        try:
            lyrics = get_lyrics(url)
            print(f'正在抓取:{url}')
            with open(f'lyrics/{index}.txt', 'w', encoding='utf-8') as f:
                f.write(lyrics)
        except Exception as e:
            print(f'抓取失败:{e}')
 
if __name__ == '__main__':
    main()

这段代码修复了原代码中的一些问题,并添加了异常处理,以确保在遇到网络问题或其他错误时代码不会中断。同时,代码中使用了更为推荐的requests库来发送HTTP请求,并使用了BeautifulSoup进行网页解析。代理服务器的设置也已经被正确地应用到了请求中。

2024-08-14



package main
 
import (
    "fmt"
    "log"
    "net/http"
    "os"
    "time"
 
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "golang.org/x/net/html"
)
 
// 初始化日志配置
func initLogger() (*zap.Logger, error) {
    encoderConfig := zapcore.EncoderConfig{
        TimeKey:        "ts",
        LevelKey:       "level",
        NameKey:        "logger",
        CallerKey:      "caller",
        MessageKey:     "msg",
        StacktraceKey:  "stacktrace",
        LineEnding:     zapcore.DefaultLineEnding,
        EncodeLevel:    zapcore.LowercaseLevelEncoder,
        EncodeTime:     zapcore.EpochMillisTimeEncoder,
        EncodeDuration: zapcore.SecondsDurationEncoder,
    }
    core := zapcore.NewCore(zapcore.NewJSONEncoder(encoderConfig), os.Stdout, zapcore.InfoLevel)
    return zap.New(core), nil
}
 
// 爬取指定URL的页面内容
func crawlPage(logger *zap.Logger, url string) (string, error) {
    client := &http.Client{Timeout: 10 * time.Second}
    resp, err := client.Get(url)
    if err != nil {
        logger.Error("Error fetching URL", zap.Error(err), zap.String("url", url))
        return "", err
    }
    defer resp.Body.Close()
 
    doc, err := html.Parse(resp.Body)
    if err != nil {
        logger.Error("Error parsing HTML", zap.Error(err), zap.String("url", url))
        return "", err
    }
 
    return doc.Text(), nil
}
 
func main() {
    logger, err := initLogger()
    if err != nil {
        log.Fatalf("无法初始化日志: %v", err)
    }
    defer logger.Sync()
 
    url := "https://example.com"
    content, err := crawlPage(logger, url)
    if err != nil {
        logger.Error("爬取页面失败", zap.Error(err), zap.String("url", url))
        return
    }
 
    fmt.Printf("爬取的页面内容: %s\n", content)
}

这段代码使用了Go 1.19的特性,并修正了原代码中的一些问题,例如日志配置的初始化和错误处理。它展示了如何使用zap库来初始化一个日志系统,并且如何使用net/httpgolang.org/x/net/html包来进行HTTP请求和HTML解析。这个例子是一个简单的网络爬虫,它抓取一个指定的URL并打印出页面的文本内容。

2024-08-14



import urllib.request
import re
 
def download_page(url):
    """下载页面内容"""
    response = urllib.request.urlopen(url)
    return response.read().decode('utf-8')
 
def parse_page(html):
    """解析页面,提取帖子链接和标题"""
    # 使用正则表达式匹配帖子链接和标题
    pattern = re.compile(r'<a href="(.+?)" target="_blank">(.+?)</a>')
    items = re.findall(pattern, html)
    return items
 
def save_to_file(content):
    """将内容保存到文件"""
    with open('data.txt', 'a', encoding='utf-8') as f:
        f.write(content)
        f.write('\n')
 
def main(url):
    """主函数,控制流程"""
    html = download_page(url)
    items = parse_page(html)
    for item in items:
        link, title = item
        print(f'下载中: {title}')
        save_to_file(f'标题: {title}\n链接: {link}')
 
if __name__ == '__main__':
    url = 'https://tieba.baidu.com/f?kw=python&ie=utf-8&pn=0'
    main(url)

这段代码实现了一个简单的基于urllib库的网页爬取示例。它下载了百度贴吧中关于"Python"的第一页内容,解析页面后提取出每个帖子的标题和链接,并将它们保存到文件中。这个例子教会了如何使用urllib库进行基本的网页下载和正则表达式的基本应用。

2024-08-14

PyMySQL 是在 Python 3.x 版本中用于替代 pymysql 的一个模块,可以实现与 MySQL 数据库的连接和通信。

安装 PyMySQL:




pip install pymysql

使用 PyMySQL 连接和操作 MySQL 数据库:




import pymysql
 
# 连接数据库
conn = pymysql.connect(host='localhost', user='your_username', password='your_password', db='your_dbname')
 
# 创建游标对象
cursor = conn.cursor()
 
# 执行SQL语句
cursor.execute("SELECT VERSION()")
 
# 获取查询结果
version = cursor.fetchone()
print("Database version: ", version)
 
# 关闭连接
cursor.close()
conn.close()

在这个例子中,我们首先导入了 pymysql 模块,然后使用 connect 方法建立了与 MySQL 数据库的连接。接着,我们创建了一个游标对象,用于执行 SQL 语句和获取结果。最后,我们执行了一个查询数据库版本的 SQL 语句,并打印了结果。最后,我们关闭了游标和连接,释放了资源。

2024-08-14



import requests
import json
 
# 创建一个Session对象,可以保持会话状态
session = requests.Session()
 
# 请求首页获取cookie
session.get('https://fanyi.baidu.com/')
 
# 准备请求详细翻译的URL和参数
url = 'https://fanyi.baidu.com/sug'
data = {
    'kw': 'translate',
    'cb': 'jQuery110206285585566497612_1585781096252',  # 这里的cb值每次请求可能不同,需要从实际请求中获取
}
 
# 发送请求
response = session.post(url, data=data)
 
# 输出响应内容
print(response.text)

这段代码使用了requests库创建了一个Session对象,通过这个Session对象发送了一个POST请求到百度翻译的建议查询API。在发送请求之前,它首先发送了一个GET请求来获取必要的cookie,从而避免了服务端的反爬机制。这种方法是一种常见的处理反爬机制的方法,通过保持会话状态来绕过网站的安全措施。

2024-08-14

Auto-py-to-exe和Pyinstaller都是将Python程序打包成可执行文件的工具,使用方法类似。以下是使用这两种工具将Scrapy爬虫项目打包成可执行文件的基本步骤:

  1. 确保你的环境中已安装了Scrapy爬虫所需的所有依赖,包括Scrapy本身。
  2. 在命令行中使用Auto-py-to-exe或Pyinstaller进行打包。

以Pyinstaller为例:




# 首先安装Pyinstaller
pip install pyinstaller
 
# 然后使用Pyinstaller打包你的Scrapy爬虫
pyinstaller --onefile your_spider.py

这里的your_spider.py是你的Scrapy爬虫的入口文件,通常是main.py或者是你定义的爬虫的start_urls所在的文件。--onefile参数表示打包成单个可执行文件。

如果你的爬虫依赖于Scrapyd或者其他服务,你可能需要修改打包后的可执行文件,以确保它能正确地启动这些服务。

对于Auto-py-to-exe,步骤类似:




# 首先安装Auto-py-to-exe
pip install auto-py-to-exe
 
# 运行Auto-py-to-exe的GUI程序进行可执行文件的生成
# 在GUI界面中选择你的脚本,以及需要的其他选项,然后生成可执行文件

注意,具体的打包选项和步骤可能会根据你的具体需求和环境有所不同,请根据实际情况调整命令和参数。

2024-08-14



import requests
 
def crawl_api_interface(url, data):
    try:
        response = requests.post(url, json=data)
        if response.status_code == 200:
            print("请求成功,响应数据:", response.json())
        else:
            print("请求失败,状态码:", response.status_code)
    except requests.exceptions.RequestException as e:
        print("请求出错:", e)
 
# 示例调用
url = "http://localhost:8080/jeecg-boot/crawl/save"
data = {
    "title": "爬虫接口练习",
    "url": "http://example.com/page",
    "type": 1,
    "status": "normal"
}
crawl_api_interface(url, data)

这段代码使用Python的requests库来发送POST请求到指定的URL。其中,data参数是需要传递给API接口的数据,通常是一个字典。如果请求成功,它会打印出响应的数据;如果请求失败,它会打印出状态码;如果发生异常,它会打印出异常信息。这个例子提供了一个简单的方法来测试API接口,并帮助开发者理解如何处理请求和响应。

2024-08-14

以下是一个简化的Python爬虫示例,用于从一个假设的旅游网站上抓取旅游景点信息。




import requests
from bs4 import BeautifulSoup
import csv
 
def get_sight_data(url):
    response = requests.get(url)
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        sight_data = {
            'name': soup.find('h1', class_='sight-name').text.strip(),
            'description': soup.find('div', class_='sight-description').text.strip(),
            'address': soup.find('div', class_='sight-address').text.strip(),
            'phone': soup.find('div', class_='sight-phone').text.strip(),
            'rating': soup.find('div', class_='sight-rating').text.strip(),
        }
        return sight_data
    else:
        return None
 
def save_to_csv(data, filename='sights_data.csv'):
    with open(filename, 'w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=data[0].keys())
        writer.writeheader()
        for row in data:
            writer.writerow(row)
 
def main():
    sight_url = 'http://fake-travel-site.com/sight/123'
    data = get_sight_data(sight_url)
    if data:
        print("爬取成功:", data)
        save_to_csv([data])
    else:
        print("爬取失败")
 
if __name__ == '__main__':
    main()

这段代码首先定义了一个get_sight_data函数,该函数接收一个URL,向网站发送请求,解析响应内容,并提取旅游景点的数据。然后定义了一个save_to_csv函数,用于将爬取的数据保存到CSV文件中。最后,在main函数中调用了get_sight_data来爬取数据,并在控制台中打印结果,同时调用save_to_csv函数将数据保存到CSV文件。

请注意,由于实际的网站可能有不同的结构和反爬虫策略,这个示例可能需要进行相应的调整才能在实际使用中有效运行。

2024-08-14

这是一个涉及多个领域的大型项目,涉及到车辆数据分析和可视化的全栈开发。由于篇幅所限,我将提供一个简化的解决方案,主要关注使用Python进行车辆数据的爬取和处理,并使用Django和Vue.js构建前后端分离的应用程序,最后使用ECharts进行数据可视化。

后端(Django)

  1. 创建Django项目和应用。
  2. 定义数据模型用于存储车辆数据。
  3. 编写爬虫代码,抓取汽车数据并保存到数据库。
  4. 提供API接口,供前端调用。

前端(Vue.js)

  1. 使用Vue CLI创建Vue项目。
  2. 设计数据可视化界面。
  3. 通过Axios发送HTTP请求从后端获取数据。
  4. 使用ECharts进行数据可视化。

示例代码

models.py (Django)




from django.db import models
 
class Car(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    # 其他车辆属性字段

spider.py (爬虫,使用Scrapy)




import scrapy
from myproject.models import Car
 
class MySpider(scrapy.Spider):
    name = 'car_spider'
    
    # 爬虫的start_urls或start_requests方法
    
    def parse(self, response):
        # 解析响应数据,提取汽车数据
        cars = [...]  # 假设已经提取数据
        for car in cars:
            # 保存数据到数据库
            Car.objects.create(name=car['name'], price=car['price'])

views.py (Django,提供API)




from rest_framework import generics
from .models import Car
from .serializers import CarSerializer
 
class CarListAPIView(generics.ListAPIView):
    queryset = Car.objects.all()
    serializer_class = CarSerializer

Vue组件 (使用Vue.js和ECharts)




<template>
  <div ref="chart" style="width: 600px; height: 400px;"></div>
</template>
 
<script>
import axios from 'axios';
import * as echarts from 'echarts';
 
export default {
  data() {
    return {
      chart: null,
      carData: []
    };
  },
  mounted() {
    this.chart = echarts.init(this.$refs.chart);
    this.fetchData();
  },
  methods: {
    fetchData() {
      axios.get('/api/cars/')
        .then(response => {
          this.carData = response.data;
          this.renderChart();
        });
    },
    renderChart() {
      const option = {
        // ECharts 配置项
      };
      this.chart.setOption(option);
    }
  }
};
</script>

这个例子只是一个简化的框架,实际项目中需要根据具体需求进行详细设计和编码。