2024-08-23



from fastapi import FastAPI
from starlette.requests import Request
from starlette.responses import JSONResponse
 
app = FastAPI()
 
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start = time.time()
    response = await call_next(request)
    process_time = time.time() - start
    response.headers["X-Process-Time"] = str(process_time)
    return response
 
@app.middleware("http")
async def custom_middleware(request: Request, call_next):
    # 在请求处理之前可以进行一些操作
    # 比如请求的验证、权限控制等
    # 如果调用 call_next,请求会继续到下一个中间件或路由
    response = await call_next(request)
    
    # 在请求处理之后可以进行一些操作
    # 比如修改响应、添加额外的头部信息等
    return response
 
@app.get("/")
async def main():
    return JSONResponse({"message": "Hello World"})

这个示例展示了如何在FastAPI应用中定义和使用middleware。首先,我们定义了一个add_process_time_header的中间件,它计算请求处理的时间并将其添加到响应头中。接着,我们定义了一个custom_middleware的中间件,它可以用于在请求处理前后进行自定义操作。最后,我们定义了一个简单的路由/,用于演示如何在没有其他中间件或路由修改的情况下,原样返回一个JSON响应。

2024-08-23



import requests
import pandas as pd
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'}
 
def get_html(url):
    response = requests.get(url, headers=headers)
    return response.text
 
def parse_html(html):
    soup = BeautifulSoup(html, 'lxml')
    titles = soup.find_all('div', class_='title')
    for title in titles:
        yield {
            'title': title.a.string,
            'href': title.a['href'],
            'score': title.find_next('span', class_='rating_num').string
        }
 
def save_data(data, filename):
    df = pd.DataFrame(data)
    df.to_csv(filename, index=False, encoding='utf-8')
 
def main():
    url = 'https://movie.douban.com/top250'
    html = get_html(url)
    data = parse_html(html)
    save_data(data, 'douban_movies.csv')
 
if __name__ == '__main__':
    main()

这段代码使用了Pandas库来保存解析后的数据,而不是之前的CSV格式。这样做的好处是可以直接将数据存储为.csv文件,并且可以方便地进行后续的数据分析工作。同时,代码中的parse_html函数使用生成器,这是一种更为高效的数据处理方式。

2024-08-23



import requests
from bs4 import BeautifulSoup
 
# 获取网页内容的函数
def get_html(url):
    try:
        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
    except requests.RequestException:
        return None
 
# 解析网页并提取数据的函数
def parse_data(html):
    soup = BeautifulSoup(html, 'lxml')
    data_list = soup.select('div.item')
    for data in data_list:
        title = data.select('a')[0].text
        detail_url = data.select('a')[0]['href']
        print(title, detail_url)
 
# 主函数
def main():
    url = 'https://www.qiushibaike.com/'
    html = get_html(url)
    parse_data(html)
 
if __name__ == '__main__':
    main()

这段代码首先定义了一个获取网页内容的函数get_html,使用了requests库来发送HTTP请求,并设置了请求头来伪装浏览器访问。然后定义了一个解析网页并提取数据的函数parse_data,使用了BeautifulSoup库和CSS选择器来选取页面元素。最后,在main函数中调用了这两个函数,实现了简单的爬虫功能。

2024-08-23



import requests
import execjs
 
# 目标URL
url = 'https://movie.douban.com/j/chart/top_list'
 
# 请求头部
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',
    'Referer': 'https://movie.douban.com/chart'
}
 
# 请求参数
params = {
    'type': '24',
    'interval_id': '100:90',
    'action': '',
    'start': '0',
    'limit': '20'
}
 
# 用于解析JavaScript加密的函数
def get_sign(params):
    with open('jssdk.js', 'r', encoding='utf-8') as f:
        js_content = f.read()
    ctx = execjs.compile(js_content)
    sign = ctx.call('get_sign', params)
    return sign
 
# 加密参数 'sign'
params['sign'] = get_sign(params)
 
# 发送请求
response = requests.get(url, headers=headers, params=params)
 
# 打印响应内容
print(response.json())

这段代码首先定义了目标URL、请求头部和请求参数。然后定义了一个函数get_sign,用于读取JavaScript文件并调用其中的get_sign函数来获取加密的sign参数。接着,将加密后的参数加入到请求参数中,并发送请求。最后打印出响应内容。这个过程展示了如何逆向解析加密参数和响应数据的基本方法。

2024-08-23



import requests
 
# 发送HTTP GET请求
def fetch_website_data(url):
    response = requests.get(url)
    if response.status_code == 200:
        return response.text
    else:
        return "Error: Server returned HTTP status code {}".format(response.status_code)
 
# 主函数
def main():
    url = "https://www.example.com"  # 替换为你想爬取的网站
    print(fetch_website_data(url))
 
# 如果这个脚本被直接运行,则执行main函数
if __name__ == "__main__":
    main()

这段代码使用了requests库来发送HTTP GET请求,获取网页内容。函数fetch_website_data负责发送请求并处理响应,主函数main则简单地调用这个函数并打印结果。如果你想要爬取的网站是"https://www.example.com",只需要将这个URL替换为你想要爬取的网站即可。

2024-08-23



import requests
from bs4 import BeautifulSoup
 
# 获取网页内容的函数
def get_html_content(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        else:
            return "页面无法访问"
    except requests.exceptions.RequestException:
        return "请求出错"
 
# 解析网页并提取信息的函数
def parse_html_info(html_content):
    soup = BeautifulSoup(html_content, 'html.parser')
    title = soup.find('h1', class_='post-title').get_text()
    content = soup.find('div', class_='post-content').get_text()
    author = soup.find('p', class_='post-meta-author').get_text()
    return title, content, author
 
# 主函数
def main():
    url = 'http://example.com/some-post'  # 替换为你要爬取的网页URL
    html_content = get_html_content(url)
    title, content, author = parse_html_info(html_content)
    print(f"标题: {title}")
    print(f"内容: {content}")
    print(f"作者: {author}")
 
if __name__ == '__main__':
    main()

这段代码展示了如何使用Python的requests库和BeautifulSoup库来简单地抓取一个网页的内容,并提取出其中的标题、内容和作者信息。在实际应用中,你需要根据目标网页的结构来修改解析代码,以确保正确提取信息。

2024-08-23



from urllib.request import urlopen
from bs4 import BeautifulSoup
 
# 获取网页内容
def get_html(url):
    try:
        response = urlopen(url)
        return response.read()
    except Exception as e:
        print(f"An error occurred: {e}")
        return None
 
# 解析网页并提取信息
def parse_html(html):
    soup = BeautifulSoup(html, 'html.parser')
    title = soup.find('title')
    return title.text if title else None
 
# 主函数
def main():
    url = 'https://www.example.com'  # 替换为你想爬取的网页URL
    html = get_html(url)
    if html:
        title = parse_html(html)
        print(title)
    else:
        print("Failed to retrieve HTML")
 
if __name__ == "__main__":
    main()

这段代码展示了如何使用Python的urllib库和BeautifulSoup库来获取网页内容并解析提取标题。需要替换https://www.example.com为你想要爬取的具体网页。

2024-08-23



import requests
from bs4 import BeautifulSoup
 
class SimpleCrawler:
    def __init__(self, start_url):
        self.start_url = start_url
 
    def fetch_url(self, url):
        """
        发送HTTP请求并获取页面内容
        """
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        else:
            return None
 
    def parse_content(self, content, parser='html.parser'):
        """
        使用BeautifulSoup解析页面内容
        """
        soup = BeautifulSoup(content, parser)
        return soup
 
    def extract_links(self, soup):
        """
        提取页面中的链接
        """
        return [link['href'] for link in soup.find_all('a', href=True)]
 
    def start_crawling(self):
        """
        开始爬取过程
        """
        # 初始URL
        url = self.start_url
 
        # 获取页面内容
        content = self.fetch_url(url)
        if content is None:
            print("页面获取失败")
            return
 
        # 解析页面内容
        soup = self.parse_content(content)
 
        # 提取链接并输出
        for link in self.extract_links(soup):
            print(link)
 
# 使用示例
crawler = SimpleCrawler('https://www.example.com')
crawler.start_crawling()

这段代码定义了一个简单的网络爬虫框架,包括获取页面内容、解析页面和提取链接。开发者可以基于这个框架进一步扩展功能,如实现深度优先或广度优先的爬取策略、处理动态内容、应对反爬机制等。

2024-08-23

下面是一个简单的Python爬虫示例,用于下载网页上的图片。




import requests
from bs4 import BeautifulSoup
import os
 
# 图片保存目录
save_dir = 'images'
if not os.path.exists(save_dir):
    os.makedirs(save_dir)
 
# 目标网页URL
url = 'http://example.com'
 
# 发送HTTP请求
response = requests.get(url)
 
# 解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')
 
# 找到所有的img标签
for img in soup.find_all('img'):
    # 获取图片的URL
    img_url = img.get('src')
    
    # 如果是相对路径,拼接成完整的URL
    if not img_url.startswith(('http:', 'https:')):
        img_url = response.urljoin(img_url)
    
    # 下载图片
    response = requests.get(img_url)
    img_data = response.content
    
    # 提取图片文件名
    filename = os.path.basename(img_url)
    
    # 保存图片到本地
    with open(os.path.join(save_dir, filename), 'wb') as f:
        f.write(img_data)
 
print("图片爬取完成,保存在", save_dir)

这段代码使用了requests库来发送HTTP请求,BeautifulSoup来解析HTML,以及os来处理文件操作。代码会下载指定网页上的所有图片,并将它们保存到本地的images文件夹中。这个例子展示了如何使用Python进行基本的网络爬取和文件操作。

2024-08-23



import requests
 
def fetch_web_data(url):
    """
    使用 Requests 库获取网页数据的简单函数
    :param url: 目标网页的 URL
    :return: 网页内容的字符串形式
    """
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        else:
            return "网页获取失败,状态码: {}".format(response.status_code)
    except requests.exceptions.RequestException:
        return "请求出错,网络问题或URL无效"
 
# 示例使用
url = "https://www.example.com"
data = fetch_web_data(url)
print(data)

这段代码定义了一个名为fetch_web_data的函数,它接受一个URL作为参数,使用requests.get方法来发送HTTP GET请求,并返回请求的响应内容。如果请求成功,它将返回网页的文本内容;如果请求失败,它将返回错误信息。此外,它还包含了异常处理,以便在遇到网络问题或无效的URL时提供更友好的错误信息。