如何使用Scrapy从多个链接页面抓取和抓取一组数据

h6my8fg2  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(181)

我试图做的是刮取公司信息(thisisavailable.eu.pn/company.html),并将所有董事会成员的数据从单独的页面添加到董事会中。
因此,理想情况下,我从示例页面中获得的数据应该是:

{
    "company": "Mycompany Ltd",
    "code": "3241234",
    "phone": "2323232",
    "email": "info@mycompany.com",
    "board": {
        "1": {
            "name": "Margaret Sawfish",
            "code": "9999999999"
        },
        "2": {
            "name": "Ralph Pike",
            "code": "222222222"
        }
    }
}

我已经搜索了谷歌和SO(像herehere和Scrapy docs等),但还没有能够找到一个解决方案的问题完全像这样。
我已经能够拼凑起来:
items.py:

import scrapy
class company_item(scrapy.Item):
    name = scrapy.Field()
    code = scrapy.Field()
    board = scrapy.Field()
    phone = scrapy.Field()
    email = scrapy.Field()
    pass

class person_item(scrapy.Item):
    name = scrapy.Field()
    code = scrapy.Field()    
    pass

蜘蛛example.py:

import scrapy
from try.items import company_item,person_item

class ExampleSpider(scrapy.Spider):
    name = "example"
    #allowed_domains = ["http://thisisavailable.eu.pn"]
    start_urls = ['http://thisisavailable.eu.pn/company.html']

    def parse(self, response):
        if response.xpath("//table[@id='company']"):
            yield self.parse_company(response)
            pass
        elif response.xpath("//table[@id='person']"):
            yield self.parse_person(response)
            pass        
        pass

    def parse_company(self, response):
        Company = company_item()
        Company['name'] = response.xpath("//table[@id='company']/tbody/tr[1]/td[2]/text()").extract_first()
        Company['code'] = response.xpath("//table[@id='company']/tbody/tr[2]/td[2]/text()").extract_first()
        board = []

        for person_row in response.xpath("//table[@id='board']/tbody/tr/td[1]"):
            Person = person_item()
            Person['name'] = person_row.xpath("a/text()").extract()
            print (person_row.xpath("a/@href").extract_first())
            request = scrapy.Request('http://thisisavailable.eu.pn/'+person_row.xpath("a/@href").extract_first(), callback=self.parse_person)
            request.meta['Person'] = Person
            return request          
            board.append(Person)

        Company['board'] = board
        return Company      

    def parse_person(self, response):       
        print('PERSON!!!!!!!!!!!')
        print (response.meta)
        Person = response.meta['Person']
        Person['name'] = response.xpath("//table[@id='person']/tbody/tr[1]/td[2]/text()").extract_first()
        Person['code'] = response.xpath("//table[@id='person']/tbody/tr[2]/td[2]/text()").extract_first()
        yield Person

更新:正如Rafael所注意到的,最初的问题是allowed_domains是错误的-我暂时把它注解掉了,现在当我运行它时,我得到(由于低代表性,在URL中添加了 ):
2017-03-07 09:41:12 [scrapy.utils.log]信息:1.3.2 Scrapy启动(bot:2017-03-07 09:41:12 [报废工具日志]信息:覆写的设定:{'新闻蜘蛛模块':'校对蜘蛛','蜘蛛模块':['蜘蛛'],'机器人_服从':为真,“机器人名称”:[剪贴板.中间件]信息:启用的扩展:['scrapy.扩展.日志统计.日志统计','scrapy.扩展.远程登录.远程控制台','scrapy.扩展.核心统计.核心统计'] 2017-03-07 09:41:13 [scrapy.中间件]已启用的下载程序中间件:['抓取.下载中间件.机器人脚本.机器人脚本中间件','抓取.下载中间件. http. HttpAuthMiddleware','抓取.下载中间件.下载超时.下载超时中间件','抓取.下载中间件.默认头.默认头中间件','抓取.下载中间件.用户代理.用户代理中间件','抓取.下载中间件.重试.重试中间件','抓取.下载中间件.重定向.元刷新中间件','抓取.下载中间件. http压缩. HttpCompression中间件',下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载中间件下载已启用的蜘蛛中间件:['抓取.蜘蛛中间件. http错误. http错误中间件','抓取.蜘蛛中间件.非现场.非现场中间件','抓取.蜘蛛中间件.referer. referer中间件','抓取.蜘蛛中间件. url长度. url长度中间件','抓取.蜘蛛中间件.深度.深度中间件'] 2017-03-07 09:41:13 [抓取.中间件]信息:启用的项目管道:[] 2017-03-07 09:41:13 [报废.核心.发动机]信息:蜘蛛打开2017-03-07 09:41:13 [scrapy.扩展.日志统计]信息:抓取0页(以0页/分钟速度),抓取0个项目(以0个项目/分钟速度)2017-03-07 09:41:13 [scrapy.extensions.telnet]调试:远程登录控制台监听127.0.0.1:6023 2017-03-07 09:41:14 [scrapy.核心.引擎]调试:抓取(404)〈获取http://
thisisavailable.eu.pn/robots.txt〉(参考:无)2017-03-07 09:41:14 [scrappy.核心.引擎]调试:2017 thisisavailable.eu.pn/scrapy/company.html -03-07 09:41:15 [scrapy.core.engine]调试:已爬网(200)〈GET http://thisisavailable.eu.pn/person2.html>(参考:(http://* thisisavailable.eu.pn/company.html)个人!!!!!!!!!!!!!2017-03-07 09:41:15 [刮擦器.核心.刮擦器]调试:从〈200 http://* www.example.com〉中摘录thisisavailable.eu.pn/person2.html{“代码”:u“222222222”,“名称”:2017-03-07 09:41:15 [报废.核心.发动机]信息:关闭蜘蛛(已完成)2017-03-07 09:41:15 [scrapy.统计收集器]信息:正在转储Scrapy属性:{'下载器/请求字节':936,“下载器/请求计数”:3、'下载器/请求方法计数/GET':3、'下载器/响应_字节':1476,“下载程序/响应计数”:3、'下载器/响应状态计数/200':2、“下载器/响应状态计数/404”:1、'完成_原因':'已完成'、'完成时间':日期时间。日期时间(2017,3,7,7,41,15,571000),“刮擦的项目计数”:1、'日志计数/调试':5、'日志_计数/信息':7、'请求深度最大值':1、“响应接收计数”:3、'调度/出队':2、'调度程序/出队/内存':2,'调度程序/入队':2,'调度程序/入队/内存':2、'开始时间':日期时间.日期时间(2017,3,7,7,41,13,404000)} 2017-03-07 09:41:15 [报废.核心.引擎]信息:弹波器闭合(完成)
如果使用“-o file.json”运行,则文件内容为:
【{【编码】:【222222222】,【品名】:“拉尔夫·派克”} ]
所以有点远,但我仍然不知所措如何使它工作。
谁能帮我把它修好?

hiz5n14c

hiz5n14c1#

您的问题与拥有多个项目无关,即使将来会有。
您的问题在输出中得到解释
[Scrapy.蜘蛛中间件.非现场]调试:已过滤的非现场请求发送至'kidplay-wingsuit.c9users.io':http://thisisavailable.eu.pn/scrapy/person2.html〉2017-03-06 10:44:33
这意味着将转到您的allowed_domains列表之外的域。
您允许的域错误。它应该是

allowed_domains = ["thisisavailable.eu.pn"]

注意事项:
不要对Person使用不同的项,只需将其用作Company中的字段,并在擦除时为其分配dictlist

相关问题