多线程Python网络爬虫卡住了

2024-03-16

我正在编写一个Python网络爬虫,我想让它成为多线程的。现在我已经完成了基本部分,以下是它的作用:

  1. 一个线程从队列中获取一个url;

  2. 线程从页面中提取链接,检查链接是否存在于池(集合)中,并将新链接放入队列和池中;

  3. 该线程将 url 和 http 响应写入 csv 文件。

但是当我运行爬虫时,它最终总是卡住,无法正常退出。我已经浏览了Python的官方文档,但仍然没有任何线索。

下面是代码:

#!/usr/bin/env python
#!coding=utf-8

import requests, re, urlparse
import threading
from Queue import Queue
from bs4 import BeautifulSoup

#custom modules and files
from setting import config


class Page:

    def __init__(self, url):

        self.url = url
        self.status = ""
        self.rawdata = ""
        self.error = False

        r = ""

        try:
            r = requests.get(self.url, headers={'User-Agent': 'random spider'})
        except requests.exceptions.RequestException as e:
            self.status = e
            self.error = True
        else:
            if not r.history:
                self.status = r.status_code
            else:
                self.status = r.history[0]

        self.rawdata = r

    def outlinks(self):

        self.outlinks = []

        #links, contains URL, anchor text, nofollow
        raw = self.rawdata.text.lower()
        soup = BeautifulSoup(raw)
        outlinks = soup.find_all('a', href=True)

        for link in outlinks:
            d = {"follow":"yes"}
            d['url'] = urlparse.urljoin(self.url, link.get('href'))
            d['anchortext'] = link.text
            if link.get('rel'):
                if "nofollow" in link.get('rel'):
                    d["follow"] = "no"
            if d not in self.outlinks:
                self.outlinks.append(d)


pool = Queue()
exist = set()
thread_num = 10
lock = threading.Lock()
output = open("final.csv", "a")

#the domain is the start point
domain = config["domain"]
pool.put(domain)
exist.add(domain)


def crawl():

    while True:

        p = Page(pool.get())

        #write data to output file
        lock.acquire()
        output.write(p.url+" "+str(p.status)+"\n")
        print "%s crawls %s" % (threading.currentThread().getName(), p.url)
        lock.release()

        if not p.error:
            p.outlinks()
            outlinks = p.outlinks
            if urlparse.urlparse(p.url)[1] == urlparse.urlparse(domain)[1] :
                for link in outlinks:
                    if link['url'] not in exist:
                        lock.acquire()
                        pool.put(link['url'])
                        exist.add(link['url'])
                        lock.release()
        pool.task_done()            


for i in range(thread_num):
    t = threading.Thread(target = crawl)
    t.start()

pool.join()
output.close()

任何帮助,将不胜感激!

Thanks

Marcus


您的爬网函数有一个无限的 while 循环,没有可能的退出路径。 条件True总是评估为True正如你所说,循环继续,

没有正确退出

修改爬网函数的 while 循环以包含条件。例如,当保存到 csv 文件的链接数量超过某个最小数量时,则退出 while 循环。

i.e.,

def crawl():
    while len(exist) <= min_links:
        ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程Python网络爬虫卡住了 的相关文章

  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • 为什么从 Pandas 1.0 中删除了日期时间?

    我在 pandas 中处理大量数据分析并每天使用 pandas datetime 最近我收到警告 FutureWarning pandas datetime 类已弃用 并将在未来版本中从 pandas 中删除 改为从 datetime 模块
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • Python 中的哈希映射

    我想用Python实现HashMap 我想请求用户输入 根据他的输入 我从 HashMap 中检索一些信息 如果用户输入HashMap的某个键 我想检索相应的值 如何在 Python 中实现此功能 HashMap
  • 将html数据解析成python列表进行操作

    我正在尝试读取 html 网站并提取其数据 例如 我想查看公司过去 5 年的 EPS 每股收益 基本上 我可以读入它 并且可以使用 BeautifulSoup 或 html2text 创建一个巨大的文本块 然后我想搜索该文件 我一直在使用
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 将 python2.7 与 Emacs 24.3 和 python-mode.el 一起使用

    我是 Emacs 新手 我正在尝试设置我的 python 环境 到目前为止 我已经了解到在 python 缓冲区中使用 python mode el C c C c将当前缓冲区的内容加载到交互式 python shell 中 显然使用了什么
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • 如何将张量流模型部署到azure ml工作台

    我在用Azure ML Workbench执行二元分类 到目前为止 一切正常 我有很好的准确性 我想将模型部署为用于推理的 Web 服务 我真的不知道从哪里开始 azure 提供了这个doc https learn microsoft co
  • datetime.datetime.now() 返回旧值

    我正在通过匹配日期查找 python 中的数据存储条目 我想要的是每天选择 今天 的条目 但由于某种原因 当我将代码上传到 gae 服务器时 它只能工作一天 第二天它仍然返回相同的值 例如当我上传代码并在 07 01 2014 执行它时 它
  • Python,将函数的输出重定向到文件中

    我正在尝试将函数的输出存储到Python中的文件中 我想做的是这样的 def test print This is a Test file open Log a file write test file close 但是当我这样做时 我收到
  • Meteor.setTimeout 和 Meteor.methods 之间的并发

    在我的 Meteor 应用程序中实现回合制多人游戏服务器 客户端通过发布 订阅接收游戏状态 并且可以调用 Meteor 方法sendTurn将回合数据发送到服务器 他们无法直接更新游戏状态集合 var endRound function g
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • Pandas 将多行列数据帧转换为单行多列数据帧

    我的数据框如下 code df Car measurements Before After amb temp 30 268212 26 627491 engine temp 41 812730 39 254255 engine eff 15
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 在本地网络上运行 Bokeh 服务器

    我有一个简单的 Bokeh 应用程序 名为app py如下 contents of app py from bokeh client import push session from bokeh embed import server do
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重

随机推荐

  • 强制下载mp4文件

    我想强迫用户下载 YouTube 视频 例如this http goo gl zNUlV网址 我下载了视频 可以播放原始视频 但即使视频的长度 大小相同 我在强制下载时也无法播放 function force download file v
  • 保留 WinRT 应用程序设置的最佳方式?

    我正在开发一个 WinRT 应用程序 它实际上也是一个游戏 我需要以文件或其他方式保存不同的信息 例如音频设置或播放器统计信息 如果它是一个文件 只需将设置写入或 我有一个想法 但我认为太初级了 获得这个的最佳方法是什么 非常感谢任何帮助或
  • PostgreSQL 字符串转义设置

    我有 2 台服务器 S1 S2与相同的SELECT version 使用相同的数据库test包含一个表t1具有类型的列text 我尝试插入 2 个带有符号的字符串数组 其中之一 INSERT into t1 columnname VALUE
  • 如何获取Scala函数的参数/返回类型?

    我有一个函数 想要获取它的参数类型和返回类型以在 Scala 宏中使用 scala gt val fn a String b Double gt 123 fn String Double gt Int
  • 尝试远程连接到 websphere 上的 JMS 队列时出现 sun/io/MalformedInputException

    我知道 非常 类似的问题 https stackoverflow com questions 27272877 how to solve sun io malformedinputexception during jndi lookup o
  • 找不到模块“反应”

    我正在尝试将 React 集成到现有的网页中 目前 我无法加载我的 React 应用程序 我的 React 应用程序有两个文件 这时 他们的样子是这样的 myApp js import React from react import Rea
  • 使用 python 2.5 安装 django,而不是使用默认版本的 python

    我必须在我的 Linux 服务器上安装 Django 其中 python 2 4 可作为默认安装 我已经安装了 python 2 5 作为单独的版本 现在我必须安装 Django 我必须将其与 python 2 5 一起使用 是否有任何特定
  • 将数据类型 varchar 转换为数字动态数据透视表时出错

    我收到标题中描述的错误 其中我的代码如下所示 declare cols numeric 10 0 sql numeric 10 0 select cols isnull cols T AmountPayd from select disti
  • 将 AST 节点转换为 python 代码

    假设我有以下字符串 code if 1 1 and 2 2 and 3 3 test 1 以下代码将该字符串转换为 AST ast parse code 然后我有一棵树 Module body lt ast If object at 0x1
  • 如何使用 Firebase 刷新令牌来持久进行身份验证?

    我几周来一直试图解决这个问题 但似乎无法理解文档或其他东西 我很感激你能提供的任何帮助 我正在使用 Firebase SDK 我有我的服务器端路由 我可以在其中访问令牌并将其发送到前端 const admin require firebas
  • 如何正确获取在 AppEngine 上运行的 NodeJS 中的云功能的令牌?

    我在获取正确的令牌来触发我的云功能时遇到问题 通过 POSTMAN 测试时 我通过运行以下命令获取令牌 gcloud auth print identity token 我的功能工作正常 但在我的服务器上我使用以下代码 我也确实看到了该令牌
  • 2 个相互关联的案例陈述

    我对 SQL 编码比较陌生 并且有一个关于 case 语句的问题 我想要实现的目标 我想创建一个用于计算正确的过时规定的查询 为此 我需要创建一个名为的列Inventory Reach和一个叫Devaluation Class 这两个字段都
  • 如何导入和导出 JBPM 6.5 存储库

    我想问您是否知道如何在不同的 Kie Workbench 之间导出和导入 JBPM 项目 我正在使用 JBPM 6 5 谢谢 使用 Git 可能是唯一合理的方法 按照此顺序 可以将项目放入 git 存储库 然后将其导入到其他实例 在装有 j
  • 抛出检查异常

    我在Java中的一些方法会抛出异常 例如NoSuchElementException IllegalArgumentException等 但是当使用这些方法时 这些异常似乎是未经检查的 换句话说 我的方法的调用者不需要对抛出这些异常的方法执
  • 在 Ruby on Rails 5 中禁用 ActiveRecord

    我是 Rails 的新手 我想在 Rails 5 中禁用 ActiveRecord 我已经找到了几个答案Here https stackoverflow com questions 28319002 how do i remove acti
  • 将整数列表传递给 GET REST API

    我想从前端的数据库中获取实体列表 所以我在 Spring MVC 中编写了 POST REST HTTP 调用 但我读过 HTTP 文档 其中说每当您必须从数据库检索数据时 更喜欢 GET 调用 那么 是否有任何我可以将 Angular J
  • 如何在android中加载低质量然后高质量的图像(就像WhatsApp个人资料图像)

    我正在寻找一种可以使用的设计模式 以便在 android recyclerView 中我可以以低质量快速加载图像 然后还可以调用高质量图像将 之后重写低质量图像 我经常看到先加载低质量图像 然后再加载高质量图像 但是 这是如何在回收器视图的
  • Javascript 在日期对象本身中设置时区,如 setTimeOffset() [重复]

    这个问题在这里已经有答案了 我想更改 Date 对象本身的时区 因为设备 网络浏览器 本身不支持时区 我怎么改变它 例如 var date new Date Value is Mon Jun 19 2017 10 00 08 GMT 000
  • Android 显式 Intent 抛出 NoClassDefFounderror

    我正在尝试使用明确的意图在我的 Android 应用程序中显示 MapView 尽管我没有发现我的代码有任何问题 但当我尝试启动我的活动时 我不断收到 NoClassDefFoundError 基本上 从我的主要活动 SetCriteria
  • 多线程Python网络爬虫卡住了

    我正在编写一个Python网络爬虫 我想让它成为多线程的 现在我已经完成了基本部分 以下是它的作用 一个线程从队列中获取一个url 线程从页面中提取链接 检查链接是否存在于池 集合 中 并将新链接放入队列和池中 该线程将 url 和 htt