Как очистить новую связь с Scrapy

1

Недавно я начал использовать Scrapy, поэтому я не так умею с этим, так что это действительно вопрос новичков.

Я разбираю некоторые случайные соглашения для практики, я очистил имена и номера стендов, но мне также нужны ссылки из компаний, которые находятся в новом окне, я нашел и сохранил ссылку из привязанных тегов, но я не знать, как очистить эти новые ссылки, любая помощь или направление будут прекрасными

import scrapy

class ConventionSpider(scrapy.Spider):
    name = 'convention'
    allowed_domains = ['events.jspargo.com/ASCB18/Public/Exhibitors.aspx?sortMenu=102003']
    start_urls = ['https://events.jspargo.com/ASCB18/Public/Exhibitors.aspx?sortMenu=102003']

    def parse(self, response):
        name = response.xpath('//*[@class="companyName"]')
        number = response.xpath('//*[@class="boothLabel"]')
        link = response.xpath('//*[@class="companyName"]')
        for row, row1, row2 in zip(name, number, link):
            company = row.xpath('.//*[@class="exhibitorName"]/text()').extract_first()
            booth_num = row1.xpath('.//*[@class="boothLabel aa-mapIt"]/text()').extract_first()
            url = row2.xpath('.//a/@href').extract_first()

            yield {'Company': company,'Booth Number': booth_num}
Теги:
web-scraping
scrapy

4 ответа

4
Лучший ответ

См. Это для справки https://github.com/NilanshBansal/Craigslist_Scrapy/blob/master/craigslist/spiders/jobs.py

import scrapy
from scrapy import Request

class ConventionSpider(scrapy.Spider):
name = 'convention'
# allowed_domains = ['events.jspargo.com/ASCB18/Public/Exhibitors.aspx?sortMenu=102003']
start_urls = ['https://events.jspargo.com/ASCB18/Public/Exhibitors.aspx?sortMenu=102003']

def parse(self, response):
    name = response.xpath('//*[@class="companyName"]')
    number = response.xpath('//*[@class="boothLabel"]')
    link = response.xpath('//*[@class="companyName"]')
    for row, row1, row2 in zip(name, number, link):
        company = row.xpath('.//*[@class="exhibitorName"]/text()').extract_first()
        booth_num = row1.xpath('.//*[@class="boothLabel aa-mapIt"]/text()').extract_first()
        url = row2.xpath('.//a/@href').extract_first()

        yield Request(url,callback=self.parse_page,meta={'Url':url,'Company': company,'Booth_Number': booth_num)

def parse_page(self,response):
    company = response.meta.get('Company')
    booth_num = response.meta.get('Booth Number')
    website = response.xpath('//a[@class="aa-BoothContactUrl"]/text()').extract_first()

    yield {'Company': company,'Booth Number': booth_num, 'Website': website}

Изменение: Комментировать строку allowed_domains, чтобы позволить искателю работать и с другими доменами.

В ответ на ваш код на странице /questions/16426961/how-to-scrape-a-new-link-with-scrapy/25324003#25324003

  • 0
    Это не будет работать из-за SyntaxError, вы забыли добавить scrapy. : yield scrapy.Request (url, callback = self.parse_page, meta = {'Url': url, 'Company': company, 'Booth_Number': booth_num)
  • 0
    Сэр, пожалуйста, смотрите оператор импорта выше: из запроса на импорт scrapy. Когда добавляется оператор импорта, запрос относится к scrapy.Request, поскольку он импортирован из модуля scrapy.
Показать ещё 5 комментариев
1

Более простой способ сделать это - подклассифицировать класс scrapy.spiders.CrawlSpider и указать атрибут rule

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class ConventionSpider(CrawlSpider):
    name = 'convention'
    allowed_domains = ['events.jspargo.com/ASCB18/Public/Exhibitors.aspx?sortMenu=102003']
    start_urls = ['https://events.jspargo.com/ASCB18/Public/Exhibitors.aspx?sortMenu=102003']

    rules = (
    Rule(LinkExtractor(allow=('', ), # allow all links that match a given regex
        deny=('')), # deny all links that match given regex
        callback='parse_item', # function that gets called for each extracted link
        follow=True),
    )

    def parse_item(self, response):
        name = response.xpath('//*[@class="companyName"]')
        number = response.xpath('//*[@class="boothLabel"]')
        link = response.xpath('//*[@class="companyName"]')
        for row, row1, row2 in zip(name, number, link):
            company = row.xpath('.//*[@class="exhibitorName"]/text()').extract_first()
            booth_num = row1.xpath('.//*[@class="boothLabel aa-mapIt"]/text()').extract_first()
            # url = row2.xpath('.//a/@href').extract_first()
            # No need to parse links because we are using CrawlSpider

            yield {'Company': company,'Booth Number': booth_num}

Убедитесь, что вы не используете parse в качестве обратного вызова, поскольку scrapy.spiders.CrawlSpider использует метод parse для реализации своей логики.

0

Там проблема с parse_page функции parse_page класса в вашем коде, и вы называете ее "разбор", а не "parse_page" по ошибке. Это может быть причиной того, почему ваш код работает неправильно. Измененный код показан ниже, и это работает очень хорошо для меня:

import scrapy
from scrapy import Request

class ConventionSpider(scrapy.Spider):
    name = 'Convention'
    allowed_domains = ['events.jspargo.com/ASCB18/Public/Exhibitors.aspx?sortMenu=102003']
    start_urls = ['https://events.jspargo.com/ASCB18/Public/Exhibitors.aspx?sortMenu=102003']

    def parse(self, response):
        name = response.xpath('//*[@class="companyName"]')
        number = response.xpath('//*[@class="boothLabel"]')
        link = response.xpath('//*[@class="companyName"]')
        for row, row1, row2 in zip(name, number, link):
            company = row.xpath('.//*[@class="exhibitorName"]/text()').extract_first(),
            booth_num = row1.xpath('.//*[@class="boothLabel aa-mapIt"]/text()').extract_first()

            next_page_url = row2.xpath('.//a/@href').extract_first()
            next_page_url = response.urljoin(next_page_url)
            yield Request(next_page_url, callback=self.parse_page, meta={'Company': company, 'Booth Number': booth_num}, dont_filter=True)

    def parse_page(self, response):
        company = response.meta.get('Company')
        booth_num = response.meta.get('Booth Number')
        website = response.xpath('//a[@class="aa-BoothContactUrl"]/text()').extract_first()
        yield {'Company': company, 'Booth Number': booth_num, 'Website': website}
0

Поэтому я последовал твоему поручению, это то, с чем я закончил, он не работает, может кто-то объяснить мне, где я делаю ошибку, и направлять меня в правильном направлении. Спасибо

import scrapy
from scrapy import Request

class ConventionSpider(scrapy.Spider):
    name = 'convention'
    allowed_domains = ['events.jspargo.com/ASCB18/Public/Exhibitors.aspx?sortMenu=102003']
    start_urls = ['https://events.jspargo.com/ASCB18/Public/Exhibitors.aspx?sortMenu=102003']

    def parse(self, response):
        name = response.xpath('//*[@class="companyName"]')
        number = response.xpath('//*[@class="boothLabel"]')
        link = response.xpath('//*[@class="companyName"]')
        for row, row1,row2 in zip(name, number, link):
            company = row.xpath('.//*[@class="exhibitorName"]/text()').extract_first(),
            booth_num = row1.xpath('.//*[@class="boothLabel aa-mapIt"]/text()').extract_first()

            next_page_url = row2.xpath('.//a/@href').extract_first()
            next_page_url = response.urljoin(next_page_url)


            yield scrapy.Request(next_page_url,callback=self.parse_page, meta={'Company': company,'Booth Number': booth_num})

            def parse(self, response):
                company = response.meta.get('Company')
                booth_num = response.meta.get('Booth Number')
                website = response.xpath('//a[@class="aa-BoothContactUrl"]/text()').extract_first()

                yield {'Company': company,'Booth Number': booth_num, 'Website': website}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню