使用来自同一 URL 的多个 POST 数据进行抓取

2024-03-15

我已经创建了一个蜘蛛,它可以收集具有匹配电话号码的公司名称列表。然后将其保存到 CSV 文件中。

然后我想使用 CSV 文件中的电话号码作为 POST 数据从另一个网站抓取数据。我希望它循环访问相同的起始 URL,但只是抓取每个电话号码生成的数据,直到 CSV 文件中不再有任何号码为止。

这是我到目前为止所得到的:

from scrapy.spider import BaseSpider
from scrapy.http import Request
from scrapy.http import FormRequest
from scrapy.selector import HtmlXPathSelector
from scrapy import log
import sys
from scrapy.shell import inspect_response
from btw.items import BtwItem
import csv

class BtwSpider(BaseSpider):
    name = "btw"
    allowed_domains = ["siteToScrape.com"]
    start_urls = ["http://www.siteToScrape.com/broadband/broadband_checker"] 

    def parse(self, response):
        phoneNumbers = ['01253873647','01253776535','01142726749']

        return [FormRequest.from_response(response,formdata={'broadband_checker[phone]': phoneNumbers[1]},callback=self.after_post)]


    def after_post(self, response):
       hxs = HtmlXPathSelector(response)
       sites = hxs.select('//div[@id="results"]')
       items = []
       for site in sites:
           item = BtwItem()

           fttcText = site.select("div[@class='content']/div[@id='btfttc']/ul/li/text()").extract()

           # Now we will change the text to be a boolean value
           if fttcText[0].count('not') > 0:
               fttcEnabled=0
           else:
               fttcEnabled=1

           item['fttcAvailable'] = fttcEnabled
           items.append(item)
       return items

目前,我一直在尝试通过列表(phoneNumbers)进行循环,但到目前为止我什至还没有设法让它发挥作用。一旦我知道如何做到这一点,我将能够自己从 CSV 文件中提取它。在当前状态下,它仅使用列表中索引为 1 的电话号码。


假设你有一个phones.csv包含手机的文件:

01253873647
01253776535
01142726749

这是你的蜘蛛:

import csv
from scrapy.item import Item, Field

from scrapy.spider import BaseSpider
from scrapy.http import Request
from scrapy.http import FormRequest
from scrapy.selector import HtmlXPathSelector


class BtwItem(Item):
    fttcAvailable = Field()
    phoneNumber = Field()


class BtwSpider(BaseSpider):
    name = "btw"
    allowed_domains = ["samknows.com"]

    def start_requests(self):
        yield Request("http://www.samknows.com/broadband/broadband_checker", self.parse_main_page)

    def parse_main_page(self, response):
        with open('phones.csv', 'r') as f:
            reader = csv.reader(f)
            for row in reader:
                phone_number = row[0]
                yield FormRequest.from_response(response,
                                                formdata={'broadband_checker[phone]': phone_number},
                                                callback=self.after_post,
                                                meta={'phone_number': phone_number})

    def after_post(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//div[@id="results"]')

        phone_number = response.meta['phone_number']
        for site in sites:
            item = BtwItem()

            fttc = site.select("div[@class='content']/div[@id='btfttc']/ul/li/text()").extract()
            item['phoneNumber'] = phone_number
            item['fttcAvailable'] = 'not' in fttc[0]

            yield item

这是运行后抓取的内容:

{'fttcAvailable': False, 'phoneNumber': '01253873647'}
{'fttcAvailable': False, 'phoneNumber': '01253776535'}
{'fttcAvailable': True, 'phoneNumber': '01142726749'}

这个想法是使用抓取主页start_requests,然后在回调中逐行读取csv文件并yield new Requests对于每个电话号码(csv 行)。另外,通过phone_number通过回调meta字典以便将其写入Item字段(我认为你需要这个来区分项目/结果)。

希望有帮助。

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

使用来自同一 URL 的多个 POST 数据进行抓取 的相关文章

随机推荐

  • 增强型 For 循环 - 对象数组

    好的 我有一个名为 Dog 的类 它接受两个参数 一个字符串和一个整数 该类有一个名为 bark 的方法 该方法根据传递给 Dog 构造函数的整数打印一个字符串 我还有一个名为 Kennel 的类 它创建了 5 个 Dog 的数组 看起来像
  • 只能检索有限数量的页面

    我想知道为什么我无法检索到第165页之后的更多页数据 page number is 165 4 image gif page number is 165 13 page number is 165 3 page number is 165
  • 复制 S3 存储桶(包括版本)

    有没有办法复制 S3 存储桶 包括对象的版本 我读到复制存储桶的方法是使用命令行工具 aws s3 sync s3
  • ASP.NET MVC 3 和 NHibernate 脚手架

    我找到了这篇文章 http blog stevensanderson com 2011 01 13 scaffold your aspnet mvc 3 project with the mvcscaffolding package htt
  • Heroku SSL 端点 - “没有这样的应用程序”

    有什么想法为什么当我访问 herokussl com URL 时 添加证书和 Heroku SSL 端点后 可能会收到 No Such App 错误 我按照这里的说明进行操作 https devcenter heroku com artic
  • 检测到依赖循环导入/无循环

    我正在尝试在 ES6 中设置 API 端点 在我的主服务器文件中 我尝试导入路由器模块 但收到错误 检测到依赖循环导入 无循环 请在下面找到我的代码以获得许可和帮助 import express from express import bo
  • 球体上的 3D 坐标为纬度和经度

    我得到以下信息 存在一个原点为 0 0 0 半径为 R 的球体 进行射线球体相交后 我知道 3D 空间中球体上的一个点 XYZ 直线穿过球体外壳的 3D 空间中的确切位置 对于我的程序 我想计算球体上 XYZ 点的纬度和经度 但我无法想出
  • 删除所有 Git 提交历史记录

    我正在尝试从 Github 获取一个存储库 恢复过去的标签 将其推送到另一个远程并删除所有历史记录 除了删除所有提交日志之外 我可以执行以下所有操作 我缺少什么 git clone https github com user user re
  • asp.net mvc 模型与实体框架模型

    在 asp net mvc model 文件夹中创建模型是最佳实践吗 将这些模型与您的视图结合使用 并使用服务层将我的模型 调整 为 EF 模型 或者您是否使用过其他方法 这种方法的问题在于 大多数时候我的 自制 模型是 EF 模型的副本
  • 失败 [INSTALL_FAILED_UPDATE_INCOMPATIBLE],然后是 DELETE_FAILED_INTERNAL_ERROR

    当我尝试在 nexus5 设备上运行应用程序时 android studio 打开错误窗口 显示 安装失败 并显示消息 INSTALL FAILED CONFLICTING PROVIDER 然后系统询问我是否要卸载现有应用程序 即使设备上
  • 将 MySQL 日期时间转换为时间戳

    我正在尝试将日期时间转换为时间戳 但 mysql 向我发出警告 并且转换后的值也是错误的 这是SQL查询 UPDATE table1 A table2 B SET B date added UNIX TIMESTAMP STR TO DAT
  • sqlite 搜索多列

    我正在尝试对表中的所有列执行区分大小写的搜索 所以我做了类似的事情 Select From mytable Where col1 col2 etc like SomeValue 但对于大写和小写它总是返回相同的结果 如果我这样做 Selec
  • 如何使用 JpegTran 递归处理 Windows 目录中的所有图像并覆盖它们?

    现在我有以下批处理文件用于处理图像 echo none cd 1 md 1 ProcessedJPEGS for i in jpg do C Program Files Image Optimization jpegtran exe opt
  • 使用 Gradle Release 插件进行 Android 构建

    我想用Gradle 发布插件 https github com townsfolk gradle release in Android Project 我配置了它 一切都很好 除了一件事 Gradle Release Plugin更改项目版
  • Django 模型子类的类型提示

    我有 Django 视图的辅助函数 如下所示 代码如下 它返回 None 或与给定查询匹配的单个对象 例如pk 1 from typing import Type Optional from django db models import
  • 哪个 API 允许我将 PayPal 保存为可重复使用的付款类型

    我目前正在开展一个项目 将 PayPal 实施为类似于保存的信用卡的可重复使用的付款选项 我在类似的网站上看到过这样做http www fab com http www fab com它允许用户登录 PayPal 一次 然后存储他们的付款信
  • 使用 PostgreSQL、Javascript 库或可重用函数存储和索引 YAML?

    PostgreSQL http www postgresql org 9 2 具有原生 JSON 支持 不过 我想将人类可读的配置文件存储在 YAML 中 我想我想索引一些 但不是全部 配置文件值 因此我想知道 例如 是否可以在 Postg
  • 如何将mongoDB数据导出为CSV格式?

    我正在寻找一种非常简单的方法将数据从 mongoDB 导出到 CSV 大多数答案都涉及 bash 脚本 等等 是否有一个简单的 mongoDB 命令可以将数据导出到 CSV 中 Update 从 mongo 3 0 6 开始 csv不再支持
  • 用于填写 PDF 表单的 Android 应用程序

    我想为 PDF 表单设计一个应用程序 只是为了通过 Android 应用程序自动填充它 我想向用户展示一些在 xml android 应用程序 UI 上设计的表单 并用传入的信息填充 pdf 表单 我有 PDF 格式的表格 我只想将其与我的
  • 使用来自同一 URL 的多个 POST 数据进行抓取

    我已经创建了一个蜘蛛 它可以收集具有匹配电话号码的公司名称列表 然后将其保存到 CSV 文件中 然后我想使用 CSV 文件中的电话号码作为 POST 数据从另一个网站抓取数据 我希望它循环访问相同的起始 URL 但只是抓取每个电话号码生成的