scrapy 提供无刮擦地址

yr9zkbsy  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(167)

我刮地址,但他们会给我没有这些是一个页面链接https://www.baroulconstanta.ro/tabloul-avocatilor/avocati-definitivi/

import scrapy
from scrapy.http import Request

class TestSpider(scrapy.Spider):
    name = 'test'
    start_urls=["https://www.baroulconstanta.ro/tabloul-avocatilor/avocati-definitivi/"]

    def parse(self, response):
        address=response.xpath("//div[@class='col-md-12']//p[1]//text()[2]").get()
        print(address)
8fsztsew

8fsztsew1#

因为数据是通过 AJAX 请求作为post方法从外部生成的,所以你得到的输出是空的。

from scrapy.crawler import CrawlerProcess
from scrapy.http import Request

class TestSpider(scrapy.Spider):
    name = 'test'

    def start_requests(self):
        yield Request(
            url= "https://www.ifep.ro/Justice/Lawyers/LawyersPanel.aspx?CompanyId=1115&CurrentPanel=Definitivi&HideHeader=1&HideFooter=1&HideFilters=1",
            callback=self.parse,
            method= "POST",
            headers= {
                'content-type': 'application/x-www-form-urlencoded',
                'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
                'x-microsoftajax':'Delta=true',
                'x-requested-with': 'XMLHttpRequest'
            }
        )

    def parse(self, response):
        for address in response.xpath('//*[@class="list-group"]'):
            print(''.join([x.get() for x in address.xpath('.//p/text()[2]')]).replace('\r\n\t','').strip())

if __name__ == "__main__":
    process =CrawlerProcess()
    process.crawl(TestSpider)
    process.start()

输出:

Sediu principal în Baroul Constanţa, adresă: NAVODARI STR .CONSTANTEI NR. 15 BL, E 1, SC. A, APRT.14
Sediu principal în Baroul Constanţa, adresă: CONSTANTA STR. BOGDAN VODA NR. 63 A
Sediu principal în Baroul Constanţa, adresă: NAVODARI CARTIER MAMAIA SAT STR. M 10 , NR. 26  CSediu principal în Baroul Constanţa, adresă: CONSTANŢA BD. FERDINAND NR. 26
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA STR. VASILE PARVAN NR. 5
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA STR. MIRCEA NR. 181, BL. M S 3 B, SC. B, AP. 38
Sediu principal în Baroul Constanţa, adresă: CONSTANTA STR. ILEANA COSANZEANA NR. 18
Sediu principal în Baroul Constanţa, adresă: CONSTANTA STR.PESCARILOR NR. 35 BL. fz 14, APRT. 
51
Sediu principal în Baroul Constanţa, adresă: CONSTANTA BD. TOMIS NR. 46 , ET.2 ,CAMERA 29     
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA STR. NICOLAE MILESCU NR. 57 BL. P N 2 , SC.A ,APRT. 42
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA BD.FERDINAND NR. 87, BL. A 4, SC. A. APRT. 1
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA STR. CĂLĂRAŞI NR. 46 ET. 1
Sediu principal în Baroul Constanţa, adresă: CONSTANTA STR. CONSTANTIN BOBESCU NR. 23, BL C, AP. 6
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA STR. DIMITRIE BOLINTINEANU NR. 32 A    
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA STR. NEHOIULUI NR. 37
9wbgstp7

9wbgstp72#

您无法提取数据,因为您要查找的页面部分位于iframe(页面中的页面)中。您有两种选择:您可以手动查找iframe的URL并在代码中解析它,或者您可以通过编程方式查找此URL并再次在代码中解析它。
下面是第二种方法(请耐心听我说,这是我第一次使用Scrapy,所以我很可能是在屠杀它,而且还有更合适的方法):

import scrapy

class TestSpider(scrapy.Spider):
    name = 'test'
    start_urls=["https://www.baroulconstanta.ro/tabloul-avocatilor/avocati-definitivi/"]

    def parse(self, response):
        frame = response.css('iframe::attr(src)').get()
        yield scrapy.Request(url=frame, callback=self.parse_frame, meta=response.meta)

    def parse_frame(self, response):
        addresses = response.xpath("//div[@class='col-md-12']//p[1]//text()[2]")

        for addr in addresses:
            print(addr.get().strip())

产生:

Sediu principal în Baroul Constanţa, adresă: NAVODARI STR .CONSTANTEI NR. 15 BL, E 1, SC. A, APRT.14
Sediu principal în Baroul Constanţa, adresă: CONSTANTA STR. BOGDAN VODA NR. 63 A
Sediu principal în Baroul Constanţa, adresă: NAVODARI CARTIER MAMAIA SAT STR. M 10 , NR. 26  C
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA BD. FERDINAND NR. 26
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA STR. VASILE PARVAN NR. 5
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA STR. MIRCEA NR. 181, BL. M S 3 B, SC. B, AP. 38
Sediu principal în Baroul Constanţa, adresă: CONSTANTA STR. ILEANA COSANZEANA NR. 18
Sediu principal în Baroul Constanţa, adresă: CONSTANTA STR.PESCARILOR NR. 35 BL. fz 14, APRT. 51
Sediu principal în Baroul Constanţa, adresă: CONSTANTA BD. TOMIS NR. 46 , ET.2 ,CAMERA 29
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA STR. NICOLAE MILESCU NR. 57 BL. P N 2 , SC.A ,APRT. 42
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA BD.FERDINAND NR. 87, BL. A 4, SC. A. APRT. 1
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA STR. CĂLĂRAŞI NR. 46 ET. 1
Sediu principal în Baroul Constanţa, adresă: CONSTANTA STR. CONSTANTIN BOBESCU NR. 23, BL C, AP. 6
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA STR. DIMITRIE BOLINTINEANU NR. 32 A
Sediu principal în Baroul Constanţa, adresă: CONSTANŢA STR. NEHOIULUI NR. 37

相关问题