在启用 cookie 的网站上使用 urlretrieve 的多线程网络抓取工具

2023-12-04

我正在尝试编写我的第一个 Python 脚本,经过大量谷歌搜索,我认为我已经完成了。然而,我需要一些帮助才能冲过终点线。

我需要编写一个脚本来登录启用 cookie 的站点,抓取一堆链接,然后生成一些进程来下载文件。我的程序以单线程运行,所以我知道代码可以工作。但是,当我尝试创建下载工作人员池时,我遇到了困难。

#manager.py
import Fetch # the module name where worker lives
from multiprocessing import pool

def FetchReports(links,Username,Password,VendorID):
    pool = multiprocessing.Pool(processes=4, initializer=Fetch._ProcessStart, initargs=(SiteBase,DataPath,Username,Password,VendorID,))
    pool.map(Fetch.DownloadJob,links)
    pool.close()
    pool.join()


#worker.py
import mechanize
import atexit

def _ProcessStart(_SiteBase,_DataPath,User,Password,VendorID):
    Login(User,Password)

    global SiteBase
    SiteBase = _SiteBase

    global DataPath
    DataPath = _DataPath

    atexit.register(Logout)

def DownloadJob(link):
    mechanize.urlretrieve(mechanize.urljoin(SiteBase, link),filename=DataPath+'\\'+filename,data=data)
    return True

在此版本中,代码失败,因为 cookie 尚未传输到工作程序以供 urlretrieve 使用。没问题,我能够使用 mechanize 的 .cookiejar 类将 cookie 保存在管理器中,并将它们传递给工作人员。

#worker.py
import mechanize
import atexit

from multiprocessing import current_process

def _ProcessStart(_SiteBase,_DataPath,User,Password,VendorID):
    global cookies
    cookies = mechanize.LWPCookieJar()

    opener = mechanize.build_opener(mechanize.HTTPCookieProcessor(cookies))

    Login(User,Password,opener)  # note I pass the opener to Login so it can catch the cookies.

    global SiteBase
    SiteBase = _SiteBase

    global DataPath
    DataPath = _DataPath

    cookies.save(DataPath+'\\'+current_process().name+'cookies.txt',True,True)

    atexit.register(Logout)

def DownloadJob(link):
    cj = mechanize.LWPCookieJar()
    cj.revert(filename=DataPath+'\\'+current_process().name+'cookies.txt', ignore_discard=True, ignore_expires=True)
    opener = mechanize.build_opener(mechanize.HTTPCookieProcessor(cj))

    file = open(DataPath+'\\'+filename, "wb")
    file.write(opener.open(mechanize.urljoin(SiteBase, link)).read())
    file.close

但是,这失败了,因为 opener(我认为)想要将二进制文件移回管理器进行处理,并且我收到一条“无法腌制对象”错误消息,指的是它试图读取文件的网页。

显而易见的解决方案是从 cookie jar 中读取 cookie,并在发出 urlretrieve 请求时手动将它们添加到标头中,但我试图避免这种情况,这就是我寻求建议的原因。


以正确的方式创建多线程网络抓取器很困难。我相信你可以处理它,但为什么不使用已经完成的东西呢?

我真的建议你看看 Scrapyhttp://scrapy.org/

它是一个非常灵活的开源网络抓取框架,可以处理您在这里需要的大部分内容。对于Scrapy,运行并发蜘蛛是一个配置问题,而不是编程问题(http://doc.scrapy.org/topics/settings.html#concurrent-requests-per-spider)。您还将获得对 cookie、代理、HTTP 身份验证等的支持。

对我来说,用 Scrapy 重写我的爬虫程序花了大约 4 个小时。所以请问问自己:你真的想自己解决线程问题,还是爬到别人的肩膀上,专注于网页抓取问题,而不是线程问题?

附言。你现在用的是机械化吗?请从机械化常见问题解答中注意到这一点http://wwwsearch.sourceforge.net/mechanize/faq.html:

“它是线程安全的吗?

不。据我所知,您可以在线程代码中使用 mechanize,但它不提供同步:您必须自己提供同步。”

如果您确实想继续使用 mechanize,请开始阅读有关如何提供同步的文档。 (例如。http://effbot.org/zone/thread-synchronization.htm, http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm)

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

在启用 cookie 的网站上使用 urlretrieve 的多线程网络抓取工具 的相关文章

  • 使用三个一维数组绘制等值线图

    正如标题所示 我想使用三个一维数组绘制等高线图 这么说吧 x np array 1 2 3 and y np array 1 2 3 and z np array 20 21 45 为了在 matplotlib 中绘制等高线图 我对x an
  • 函数名称未定义

    我有一段代码 看起来像这样 if name main main def main print hello 但是 当我尝试运行此代码时 出现错误 NameError 名称 main 未定义 我是否没有在函数 def main 的第一行定义名称
  • pandas read_csv 之前预处理数据文件

    我使用 SAP 的数据输出 但它既不是 CSV 因为它不引用包含其分隔符的字符串 也不是固定宽度 因为它具有多字节字符 它是一种 固定宽度 字符 为了将其放入 pandas 我当前读取文件 获取分隔符位置 对分隔符周围的每一行进行切片 然后
  • 删除 tkinter 文本默认绑定

    我正在制作一个简单的 tkinter 文本编辑器 但我想要所有默认绑定文本小部件如果可能的话删除 例如当我按Ctrl i它默认插入一个制表符 我制作了一个事件绑定来打印文本框中有多少行 我将事件绑定设置为Ctrl i以及 当我运行它时 它会
  • 我可以同时打开两个 Tkinter Windows 吗?

    可以同时打开2个窗口吗 import tkinter as Tk import random import math root Tk Tk canvas Tk Canvas root background image Tk PhotoIma
  • NumPy 数组与 SQLite

    我在 Python 中见过的最常见的 SQLite 接口是sqlite3 但是有什么东西可以很好地与 NumPy 数组或 rearray 配合使用吗 我的意思是 它可以识别数据类型 不需要逐行插入 并提取到 NumPy rec 数组中 有点
  • pandas 数据框的最大大小

    我正在尝试使用读取一个有点大的数据集pandas read csv or read stata功能 但我不断遇到Memory Errors 数据帧的最大大小是多少 我的理解是 只要数据适合内存 数据帧就应该没问题 这对我来说不应该是问题 还
  • 无法使用Python请求会话模块登录网站

    我刚刚开始进行网络抓取 对于我的第一个项目 我尝试使用 requests Session 登录 artofproblemsolving com 并访问另一个用户的帐户 这是我的代码 import requests LOGIN URL htt
  • Python Apache Beam 端输入断言错误

    我对 Apache Beam Cloud Dataflow 还很陌生 所以如果我的理解不正确 我深表歉意 我正在尝试通过管道读取大约 30 000 行长的数据文件 我的简单管道首先从 GCS 打开 csv 从数据中提取标题 通过 ParDo
  • 对法语文本进行词形还原[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一些法语文本需要以某种方式进行处理 为此 我需要 首先 将文本标记为单词 然后对这些单词进行词形还原以避免多次处理相同的词根 据我
  • argparse 不检查位置参数

    我正在创建一个脚本 它使用 argparse 接受位置参数和可选参数 我已经阅读了 Doug 的教程和 python 文档 但找不到答案 parser argparse ArgumentParser description script t
  • matplotlib vlines 图中未应用 y 轴的最小值

    我正在 matplotlib 中绘制 vlines 图 数据集中的所有 y 值如下 gt 0 我希望 y 轴最底部的刻度能够读取0 但相反 我得到 500 这是代码 usr bin env python import numpy as np
  • Pygame:有人可以帮我实现双跳吗?

    我知道已经有其他关于此问题的帖子了 但我的运动系统与我发现的有点不同 所以随后我问这个问题 我的运动系统基于一个名为的命名元组Move up left right down 然后就是这个 def update self move block
  • 增强迪基-富勒测试中的 BIC 在 Python 中到底是如何工作的?

    这个问题是关于 statsmodels tsa stattools python 库 adfuller 中的增强迪基 富勒测试实现 原则上 AIC 和 BIC 应该计算一组可用模型的信息标准 并选择最好的模型 信息损失最低的模型 但它们在增
  • Python GTK3 Treeview 向上或向下移动选择

    如何在树视图中向上或向下移动所选内容 我的想法是 我可以使用向上和向下按钮将选择向上移动一行或向下移动一行 我的 Treeview 使用 ListStore 不确定这是否重要 首先 我将使用我熟悉的 C 代码 如果您在将其翻译为 Pytho
  • 解析整数集的字符串并列出间隔

    I have 2 5 7 9 12 string 我想从中获取 2 5 7 8 9 12 列表 python中有没有内置的函数 Thanks UPD 我想 直接的答案是No 不管怎样 谢谢你的 片段 使用一个 建议者斯文 马尔纳克 s 2
  • 如何将 django ModelForm 字段显示为不可编辑

    接受我的初步教训django ModelForm 我想让用户能够编辑博客中的条目 BlogEntry has a date postedTime title and content 我想向用户展示一个编辑表单 其中显示所有这些字段 但仅包含
  • python 中的 F 字符串前缀给出语法错误[重复]

    这个问题在这里已经有答案了 我有一个名为 method 的变量 它的值是 POST 但是当我尝试运行时print f method method is used 它不断在最后一个双引号处给出语法错误 我找不到它这样做的原因 我正在使用 py
  • 将二进制数据视为文件对象?

    在此代码片段 由另一个人编写 中 self archive是一个大文件的路径并且raw file是以二进制数据形式读取的文件内容 with open self archive rb as f f seek offset raw file s
  • 为数据集生成随机 JSON 结构排列

    我想生成 JSON 结构的许多不同排列作为同一数据集的表示 最好不需要对实现进行硬编码 例如 给定以下 JSON name smith occupation agent enemy humanity nemesis neo 应该产生许多不同

随机推荐

  • 将 base64 字符串转换为 ArrayBuffer

    我需要将 Base64 编码字符串转换为 ArrayBuffer Base64 字符串是用户输入 它们将从电子邮件中复制并粘贴 因此在加载页面时它们不存在 如果可能的话 我想在 javascript 中执行此操作 而不对服务器进行 ajax
  • 如何在 Go 中向子路由器添加中间件?

    我有以下代码 apiRouter mux NewRoute PathPrefix Subrouter Bucket router bucket apiRouter PathPrefix bucket Subrouter bucket Met
  • 通过 PayPal 和信用卡接收付款

    我正在开发一个网站 我需要从 PayPal 和信用卡接收付款 问题是我对此一无所知 我的问题是我在哪里可以找到一些很好的资源来帮助我 或者如果您有一些示例代码 一切可以帮助我的东西 多谢 如果您计划集成 Paypal 您会发现 Paypal
  • 如何向单个sql命令添加超过10000个参数

    我想向单个 sql 命令添加超过 10000 个参数 怎么可能呢 据我所知 一个sql命令有2100个参数 我认为你应该回到 为什么 而不是直接跳到 如何 听起来也许您正在执行一些巨大的插入 更新 在这种情况下 更合适的解决方案是表值参数
  • Android:使多行编辑文本可滚动,在垂直滚动视图中禁用

    我正在开发一个应用程序 其中我在某个点上进行了结构 根据我的应用程序要求 我在 xml 中创建了水平滚动视图 然后在 java 中创建了垂直滚动视图 如下所示 Vertical Scroll view in Linear layout Sc
  • 如何在不使用 fetch 的情况下知道本地仓库与远程仓库不同?

    我有数十个存储库 如果发生任何差异 我的脚本应该更新它们 新提交 新标签 新分支 在我的情况下 对于数十个存储库来说 获取有点慢 我想知道是否有任何快速命令可以满足我的要求 您可以使用git ls remote管道命令无需获取即可获取遥控器
  • Android 蓝牙连接另一个蓝牙设备

    我正在做基于蓝牙的应用程序 我想连接其他设备 例如诺基亚设备和打印机 我参考了android蓝牙文档http developer android com guide topics connectivity bluetooth html 它演
  • * 和 + 正则表达式之间的区别

    谁能告诉我两者之间的区别 and 下例中的运算符 lt gt lt gt 它们每个都是量词 星号量词 表示前面的表达式可以匹配零次或多次 就像 0 而加量词 表示前面的表达式必须匹配至少一次或多次 并且它与 1 回顾一下 a gt a 0
  • 后台工作者如何

    我正在尝试在我的程序中实现后台工作人员 这样当我运行程序并开始检索我需要的数据时它就不会冻结 我不太清楚后台工作者是如何工作的 后台工作人员是在后台运行的线程 它们在不中断 阻塞主线程的情况下工作 您可以阅读更多内容here 简而言之 在
  • 将模块导入 Python Azure Function

    我正在尝试创建一个简单的 Azure 函数 它接收 HTTP 事件 获取该请求正文中的 JSON 对象 并将该对象保存为 CosmosDB 集合中的文档 然而 我似乎对导入 python 模块很着迷 init py import json
  • 如何为 play2 的表单定义 StopOnFirstFail dsl?

    在这个问题中 如果一个表单字段有多个验证器 如何让play一一验证它们 而不是全部验证 Julien 给了我一个名为stopOnFirstFail解决我的问题 def stopOnFirstFail T constraints Constr
  • 使用AWS SES从node.js上传邮件中的.jpg图像附件

    下面是来自的代码https github com andrewpuch aws ses node js examples其中有一个发送示例和带有附件的电子邮件 我修改了代码以从 aws s3 获取图像文件并将其作为附件以邮件形式发送 当我为
  • 如何在 Python 中使用 HTTPPasswordMgrWithDefaultRealm()

    我需要编写一些使用 ftp 代理的 python ftp 代码 代理不需要身份验证 但我连接的 ftp 服务器需要身份验证 我有以下代码 但收到 I O 错误 ftp 错误 501 USER 格式 proxy user auth metho
  • 查找特定的正整数[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想找到整数n 以便当1 z 1 x 1 n时有1000种组合 这是我的代码 int counter 0 double n 1 while true for double i 1
  • 销售订单视图上的自定义选项卡

    如何在不修改核心代码的情况下向 Magento 中的销售订单视图添加新选项卡 我在网上看到了一些教程 但他们希望您在 app design adminhtml default default template 中添加 修改文件 这是核心目录
  • 在循环内如何将绘图存储在列表中?

    我正在循环内工作 我想将绘图保存在列表中 以便我可以将它们一起绘制在 pdf 中 问题在于列表未正确填充并使用上次运行的结果重新更新 所以 最终我得到的是一个包含五个完全相同的元素的列表 我知道这些循环可能看起来毫无用处 但我只是让它们创建
  • 有没有办法使用 Spotify API 暂停?

    我希望能够暂停当前曲目 但似乎找不到任何方法 文档在这里 http developer spotify com download spotify apps api reference 我正在使用以下内容来播放曲目 m player play
  • NSStream、UTF8String 和 NSString...混乱的转换

    我正在构建一个数据包 通过 NSStream 发送到服务器 我试图用 ascii 代码 167 分隔两条数据 这就是服务器的构建方式 所以我需要尝试保持在这些范围内 unichar asciiChar 167 yields self set
  • “{ }”的 Visual Studio Code 格式

    我在Ubuntu上 Visual Studio Code 中的 C 自动 lints 就像 if condition true DoStuff 相反 我想做 if condition true DoStuff 我怎么做 我已经安装了C C
  • 在启用 cookie 的网站上使用 urlretrieve 的多线程网络抓取工具

    我正在尝试编写我的第一个 Python 脚本 经过大量谷歌搜索 我认为我已经完成了 然而 我需要一些帮助才能冲过终点线 我需要编写一个脚本来登录启用 cookie 的站点 抓取一堆链接 然后生成一些进程来下载文件 我的程序以单线程运行 所以