云盾E易盾V37网络验证 2024-06-20 19:30 采纳率: 0%
浏览 7
已结题

python提取.csv文件中的链接会经常出现爬取失败


import os
import csv
import requests
import random
import re
from bs4 import BeautifulSoup
import time

# 当前文件夹路径
current_folder = os.getcwd()

def crawl_and_save_links():
    # 用于保存爬取结果
    results = []

    # 定义正则表达式模式匹配链接
    link_pattern = re.compile(r'https?://[^\s]+')

    # 遍历当前文件夹中的文件
    for file in os.listdir(current_folder):
        if file.endswith('.csv'):
            file_path = os.path.join(current_folder, file)
            with open(file_path, 'r') as csv_file:
                csv_reader = csv.reader(csv_file)
                for row in csv_reader:
                    for cell in row:
                        match = link_pattern.search(cell)
                        if match:
                            link = match.group()
                            try:
                                response = requests.get(link)
                                print(response.text)
                                if response.status_code == 200:
                                    soup = BeautifulSoup(response.text, 'html.parser')
                                    text = soup.get_text()
                                    results.append([link, text])
                            except requests.exceptions.RequestException as e:
                                print(f"爬取 {link} 时出错: {e}")
                            # 添加随机时间间隔
                            time.sleep(random.uniform(1, 3))
    # 将结果保存到新的 CSV 文件
    with open('crawled_results.csv', 'w', newline='', encoding='utf-8') as output_file:
        csv_writer = csv.writer(output_file)
        csv_writer.writerow(['链接', '文本内容'])
        for result in results:
            csv_writer.writerow(result)

if __name__ == '__main__':
    crawl_and_save_links()

还有爬取成保存的文件会出现乱码,和不必要的空格

  • 写回答

25条回答 默认 最新

  • 阿里嘎多学长 2024-06-20 19:30
    关注
    获得0.30元问题酬金

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在Python中使用requests库和BeautifulSoup进行网页爬取时,遇到爬取失败和结果文件乱码或空格问题,通常可以通过以下几个方面来改进:

    1. 提高爬取成功率

      • 设置User-Agent:一些网站会根据请求的User-Agent来决定是否允许访问。你可以设置一个常见的User-Agent来模拟浏览器访问。
      • 处理重定向:使用requests.get()时,可以设置allow_redirects=True(默认值)来自动处理重定向。
      • 设置超时:为请求设置超时时间,避免长时间等待响应。
      • 使用代理:如果遇到IP被封禁的情况,可以使用代理来绕过限制。
    2. 处理乱码问题

      • 确保请求时指定了正确的编码。如果不知道网页的编码,可以先获取网页内容,然后使用chardet库来检测编码。
      • 在保存文件时,确保使用正确的编码,通常是utf-8
    3. 处理不必要的空格问题

      • 使用strip()方法去除字符串两端的空格。
      • 使用正则表达式去除字符串中间的多余空格。
    4. 异常处理

      • 使用更详细的异常处理来了解请求失败的具体原因。
    5. 遵守robots.txt协议

      • 确保你的爬虫遵守目标网站的robots.txt文件,以免被网站视为恶意访问。
    6. 增加爬取间隔

      • 避免过于频繁的请求同一网站,可以设置更长的随机时间间隔。

    下面是改进后的代码示例:

    import os
    import csv
    import requests
    import random
    import re
    from bs4 import BeautifulSoup
    import time
    from requests.exceptions import RequestException, Timeout
    from chardet import detect
    
    # 当前文件夹路径
    current_folder = os.getcwd()
    
    def crawl_and_save_links():
        results = []
        link_pattern = re.compile(r'https?://[^\s]+')
    
        for file in os.listdir(current_folder):
            if file.endswith('.csv'):
                file_path = os.path.join(current_folder, file)
                with open(file_path, 'r', encoding='utf-8') as csv_file:
                    csv_reader = csv.reader(csv_file)
                    for row in csv_reader:
                        for cell in row:
                            match = link_pattern.search(cell)
                            if match:
                                link = match.group()
                                try:
                                    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
                                    response = requests.get(link, headers=headers, timeout=5)
                                    if response.status_code == 200:
                                        encoding = detect(response.content)['encoding'] or 'utf-8'
                                        soup = BeautifulSoup(response.content, 'html.parser')
                                        text = soup.get_text(separator=' ').strip()
                                        results.append([link, text])
                                except (RequestException, Timeout) as e:
                                    print(f"爬取 {link} 时出错: {e}")
                                time.sleep(random.uniform(1, 3))
    
        with open('crawled_results.csv', 'w', newline='', encoding='utf-8') as output_file:
            csv_writer = csv.writer(output_file)
            csv_writer.writerow(['链接', '文本内容'])
            for result in results:
                csv_writer.writerow(result)
    
    if __name__ == '__main__':
        crawl_and_save_links()
    

    注意:以上代码中使用了chardet库来检测网页内容的编码,你可能需要安装这个库:

    pip install chardet
    

    至于参考链接,以下是一些有用的资源:

    希望这些信息能帮助你改进你的爬虫代码。如果还有其他问题,随时欢迎提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月28日
  • 创建了问题 6月20日

悬赏问题

  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误