2024-08-16

该项目是一个使用Python编写的微博爬虫,用于爬取新浪微博上用户或话题的数据。以下是核心的爬虫功能代码示例:




import requests
from bs4 import BeautifulSoup
import re
import time
import random
 
def get_page(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'}
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    return None
 
def parse_page(html, user_id):
    if html is not None:
        soup = BeautifulSoup(html, 'lxml')
        weibo_list = soup.find_all(class_='weibo')
        for weibo in weibo_list:
            weibo_id = re.findall(r'weibo_id=(\d+)', str(weibo))[0]
            weibo_text = weibo.find(class_='txt').text.strip()
            like_count = re.findall(r'<span class="ctt">(.*?)</span>', str(weibo), re.S)[0]
            comment_count = re.findall(r'<span class="cc">(.*?)</span>', str(weibo), re.S)[0]
            repeat_count = re.findall(r'<span class="cc">(.*?)</span>', str(weibo), re.S)[0]
            # 保存微博数据的逻辑...
 
def crawl_user_weibo(user_id, start_page, end_page):
    for i in range(start_page, end_page + 1):
        url = 'https://weibo.com/p/100505{}/info?mod=pedit_more'.format(user_id)
        html = get_page(url)
        parse_page(html, user_id)
        time.sleep(random.uniform(1, 3))  # 防止被封
 
if __name__ == '__main__':
    user_id = '1234567890'  # 替换为目标用户的ID
    start_page = 1  # 起始页
    end_page = 10  # 结束页
    crawl_user_weibo(user_id, start_page, end_page)

这段代码提供了一个简化的微博爬虫框架,包括了请求页面、解析页面和保存数据的基本方法。实际应用时,你需要提供正确的用户ID,设置爬取的起始页和结束页,并实现数据保存的逻辑。

请注意,此代码仅用于学习目的,实际使用时应遵守新浪微博的爬虫政策,并且不得用于非法活动。

2024-08-16



from flask import Flask, render_template, request
import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
from io import BytesIO
import base64
 
app = Flask(__name__)
 
@app.route('/')
def index():
    return render_template('index.html')
 
@app.route('/stickers', methods=['POST'])
def stickers():
    board_name = request.form['board_name']
    start_page = request.form['start_page']
    end_page = request.form['end_page']
    df = crawl_stickers(board_name, start_page, end_page)
    image_data = plot_sticker_rating(df)
    return render_template('stickers.html', image_data=image_data)
 
def crawl_stickers(board_name, start_page, end_page):
    # 这里应该是爬虫的实现代码,获取贴吧数据并存储到DataFrame
    pass
 
def plot_sticker_rating(df):
    # 这里应该是绘图的实现代码,将评分按照popularity_score字段绘制为柱状图,并将图像转换为base64字符串
    pass
 
if __name__ == '__main__':
    app.run(debug=True)

这个代码实例提供了一个简化的框架,展示了如何使用Flask框架创建一个简单的Web应用,并结合了爬虫和可视化的功能。在实际应用中,你需要实现crawl_stickersplot_sticker_rating函数以完成数据爬取和数据分析的具体任务。

2024-08-16

在使用Selenium进行图片爬虫时,首先需要定位到包含图片的元素,然后获取元素的属性来获取图片的URL。以下是一个简单的例子,假设我们要获取一篇包含图片的网页中的所有图片链接:




from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
 
# 启动浏览器
driver = webdriver.Chrome()
 
# 打开网页
driver.get('http://example.com/article-with-images')
 
# 等待页面加载完成
wait = WebDriverWait(driver, 10)
 
# 获取文章中的所有图片元素
images = wait.until(EC.presence_of_all_elements_located((By.TAG_NAME, 'img')))
 
# 循环遍历图片元素,获取图片链接
for img in images:
    src = img.get_attribute('src')
    print(src)
 
# 关闭浏览器
time.sleep(5)  # 等待5秒,以便于查看结果
driver.quit()

请确保在运行此代码之前已经安装了Selenium库和相应的WebDriver(如ChromeDriver),并且已经正确配置了路径。此代码会打开指定的网页,加载所有的图片元素,并打印出它们的src属性,即图片链接。

2024-08-16



import requests
from bs4 import BeautifulSoup
import re
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_all_posts(url):
    # 发送GET请求
    response = requests.get(url, headers=headers)
    # 解析HTML内容
    soup = BeautifulSoup(response.text, 'lxml')
    # 提取帖子信息
    posts = soup.find_all('div', class_='feed-item-root')
    return posts
 
# 定义一个函数来提取帖子详细信息
def extract_post_info(post):
    try:
        # 提取帖子标题
        title = post.find('a', class_='title-box').text.strip()
        # 提取帖子链接
        post_url = post.find('a', class_='title-box')['href']
        # 提取作者昵称和昵称链接
        author_info = post.find('div', class_='author-info').text.strip()
        author_name = re.search('(.+)', author_info).group(1)
        author_url = post.find('a', class_='author-name')['href']
        # 提取作品类型
        media_type = post.find('div', class_='media-type').text.strip()
        # 提取阅读量
        read_count = post.find('div', class_='read-count').text.strip()
        # 提取点赞数
        like_count = post.find('div', class_='like-count').text.strip()
        # 提取评论数
        comment_count = post.find('div', class_='comment-count').text.strip()
        # 提取发布时间
        publish_time = post.find('div', class_='publish-time').text.strip()
        # 返回所有提取的信息
        return {
            'title': title,
            'url': post_url,
            'author_name': author_name,
            'author_url': author_url,
            'media_type': media_type,
            'read_count': read_count,
            'like_count': like_count,
            'comment_count': comment_count,
            'publish_time': publish_time
        }
    except Exception as e:
        print(f'Error extracting post info: {e}')
        return None
 
# 主函数
def main(max_pages):
    # 初始化帖子列表和页码
    posts = []
    page = 1
    
    # 循环遍历页面
    while page <= max_pages:
        print(f"Crawling page {page}")
        # 构造页面URL
        url = f'https://www.xiaohongshu.com/discovery/trending?page={page}'
        # 获取页面所有帖子
        all_posts = get_all_posts(url)
        # 提取每个帖子的详细信息
        for post in all_posts:
        
2024-08-16

由于原始代码已经提供了一个很好的示例,以下是一个简化的代码实例,用于抓取小行星的直径数据:




import requests
from bs4 import BeautifulSoup
 
# 定义一个函数来获取小行星的直径数据
def get_asteroid_diameters(asterank_url):
    # 发送HTTP请求
    response = requests.get(asterank_url)
    response.raise_for_status()  # 检查请求是否成功
 
    # 解析响应内容
    soup = BeautifulSoup(response.text, 'html.parser')
 
    # 找到包含直径信息的表格
    table = soup.find('table', {'class': 'asterank'})
 
    # 初始化直径列表
    diameters = []
 
    # 遍历表格中的所有行,跳过表头
    for row in table.find_all('tr')[1:]:
        # 提取直径数据
        diameter = row.find_all('td')[4].text.strip()
        diameters.append(diameter)
 
    return diameters
 
# 使用函数获取小行星直径数据
asterank_url = 'https://www.asterank.com/neo.php'
diameters = get_asteroid_diameters(asterank_url)
 
# 打印直径数据
for diameter in diameters:
    print(diameter)

这段代码简化了原始代码,去除了原始代码中的一些冗余部分,并且使用更为直接的方法来查找和提取小行星的直径数据。这个示例假设表格结构不会改变,如果结构发生变化,则需要更新解析代码以匹配新的结构。

2024-08-16



import requests
from bs4 import BeautifulSoup
import datetime
 
def get_weather_data(city):
    # 天气信息网站的URL模板
    url = "http://www.weather.com.cn/weather/{}.shtml".format(city)
    # 发送HTTP请求
    response = requests.get(url)
    # 解析网页
    soup = BeautifulSoup(response.text, 'lxml')
 
    # 提取天气信息
    today_weather = soup.select('#7d .sky .temp')
    today_temperature = today_weather[0].text
    today_weather_icon = soup.select('#7d .sky img')[0]['src']
    today_weather_info = soup.select('#7d .wea')[0].text.strip()
 
    # 打印信息
    print("城市:", city)
    print("今日天气:", today_weather_icon, today_temperature, today_weather_info)
 
# 调用函数,传入城市名,例如 "北京"
get_weather_data("北京")

这段代码使用了requests库来发送HTTP请求,bs4库来解析网页,并使用select方法来定位HTML元素。然后,它提取了今日的天气信息,包括温度和天气状况,并打印出来。这个例子简单直观,适合作为爬虫入门学习的实例。

2024-08-16

QCCSpider是一个智能化的数据采集框架,它提供了一种新的方式来处理网络爬虫的开发和数据采集过程。以下是一个使用QCCSpider的示例代码:




from qccspider.spider import Spider
from qccspider.selector import Selector
from qccspider.scheduler import Scheduler
from qccspider.pipeline import Pipeline
from qccspider.middlewares import Middlewares
 
# 初始化爬虫
spider = Spider()
 
# 定义爬虫的名字
spider.name = 'example_spider'
 
# 定义启动URL
spider.start_urls = ['http://example.com/']
 
# 定义解析函数
@spider.parse(Selector.type.XPATH, '//a[@href]', process_links=True)
def parse_example(self, response):
    # 提取链接和文本
    for link in response.css('a::attr(href)').extract():
        yield {'url': link, 'text': response.css('a::text').extract_first()}
 
    # 定义数据管道
pipeline = Pipeline()
 
@pipeline.process_item(item_type='*')
def print_item(item):
    print(item)
 
# 运行爬虫
spider.run(pipeline=pipeline)

这段代码定义了一个简单的爬虫,它会从指定的URL开始,并提取页面中所有链接的URL和对应的文本。然后,使用Pipeline打印出每个抓取到的项目。这个例子展示了QCCSpider的基本用法,并且通过使用装饰器的方式定义了解析规则,使得代码更加简洁和易于理解。

2024-08-16



import redis
 
class RedisClient:
    """
    Redis客户端,用于管理Redis连接。
    """
    def __init__(self, host='localhost', port=6379, db=0):
        self.host = host
        self.port = port
        self.db = db
        self._connection = None
 
    def connect(self):
        """
        建立到Redis服务器的连接。
        """
        self._connection = redis.Redis(host=self.host, port=self.port, db=self.db)
 
    def disconnect(self):
        """
        关闭与Redis服务器的连接。
        """
        if self._connection:
            self._connection.close()
            self._connection = None
 
    def set(self, name, value, ex=None, px=None, nx=False, xx=False):
        """
        设置键值对,使用与redis.Redis.set相同的参数。
        """
        self._connect_if_needed()
        return self._connection.set(name, value, ex, px, nx, xx)
 
    def get(self, name):
        """
        获取键的值,使用与redis.Redis.get相同的参数。
        """
        self._connect_if_needed()
        return self._connection.get(name)
 
    def _connect_if_needed(self):
        """
        如果尚未连接,则建立连接。
        """
        if not self._connection:
            self.connect()
 
# 使用示例
client = RedisClient()
client.set('key', 'value')
print(client.get('key'))
client.disconnect()

这段代码定义了一个名为RedisClient的类,用于管理与Redis服务器的连接。它提供了连接和断开连接的方法,并且在需要时才建立连接。此外,它还提供了setget方法,以便动态地存储和检索数据。这个类的实例可以用来进行基本的Redis操作,而无需手动管理连接的打开和关闭。

2024-08-16

在Python中,使用XPath解析HTML内容通常涉及到lxml库。以下是一个使用XPath解析网页内容的例子:

首先,安装lxml库(如果尚未安装):




pip install lxml

然后,使用以下代码解析网页并提取所需的数据:




from lxml import etree
import requests
 
# 发送HTTP请求获取网页内容
url = 'http://example.com'
response = requests.get(url)
 
# 检查请求是否成功
if response.status_code == 200:
    # 解析网页内容为XPath可以处理的对象
    html = etree.HTML(response.text)
    
    # 定义XPath表达式来选取需要的数据
    # 例如://div[@class="content"]/ul/li/a
    xpath_expression = 'YOUR_XPATH_EXPRESSION_HERE'
    
    # 使用XPath表达式提取数据
    results = html.xpath(xpath_expression)
    
    # 处理提取的数据
    for result in results:
        # 提取每个li标签下的a标签的href属性和文本内容
        href = result.get('href')
        text = result.text
        print(f'Href: {href}, Text: {text}')
else:
    print("Failed to retrieve the webpage")

在这个例子中,你需要替换YOUR_XPATH_EXPRESSION_HERE为你想要提取的数据的XPath表达式。这个表达式会告诉解析器如何在HTML文档中定位你感兴趣的元素。

请注意,XPath表达式的编写需要你对HTML结构有足够的了解。如果你想要提取的数据深藏在嵌套的标签之中,你可能需要编写一个复杂的XPath表达式来精确地定位它们。

2024-08-16



import tkinter as tk
import requests
from bs4 import BeautifulSoup
 
def fetch_quotes(symbol):
    url = f"https://finance.yahoo.com/quote/{symbol}"
    response = requests.get(url)
    if response.ok:
        soup = BeautifulSoup(response.text, 'html.parser')
        name = soup.find(id='quote-header-info').find('h1').text
        price = soup.find(class_='My<span class="katex">\(b\)</span>').text
        return f"{name} - {price}"
    else:
        return "Error fetching quote"
 
def update_quote(symbol):
    quote = fetch_quotes(symbol.get())
    quote_label.config(text=quote)
 
root = tk.Tk()
root.title("Yahoo Finance Stock Quote Fetcher")
root.geometry("400x200")
 
symbol_label = tk.Label(root, text="Enter stock symbol:")
symbol_label.pack()
 
symbol_entry = tk.Entry(root)
symbol_entry.pack()
 
fetch_button = tk.Button(root, text="Fetch Quote", command=lambda: update_quote(symbol_entry))
fetch_button.pack()
 
quote_label = tk.Label(root, text="")
quote_label.pack()
 
root.mainloop()

这段代码使用了tkinter库来创建一个简单的用户界面,允许用户输入股票代码,并在点击按钮后获取该股票的名称和价格。这个例子教会了如何将爬虫逻辑集成到图形用户界面中,并展示了如何使用Python进行简单的GUI编程。