Если состояние в Scrapy - PullRequest
0 голосов
/ 03 июля 2019

Я использую scrapy, чтобы очистить тег в заданном URL-адресе и проверить, соответствует ли URL-ссылка в теге URL-адресу веб-сайта.Я хочу экспортировать результаты в csv со столбцом, который указывает, есть ли совпадение.

У меня есть следующий код, но я не уверен, как добавить условие соответствия:

import scrapy
import pandas as pd
import csv
from scrapy.crawler import CrawlerProcess


class urlsitem(scrapy.Item):
    status=scrapy.Field()
    url=scrapy.Field()
    canonical=scrapy.Field()


class URLSpider(scrapy.Spider):
    handle_httpstatus_list = [301]
    REDIRECT_ENABLED=False
    name = "urls"
    data = ['https://www.wayfair.com/bed-bath/sb0/bedding-c481592.html']
    start_urls =  list(data.iloc[0:,0])


def parse(self, response):

    item=urlsitem()
    item['status']=response.status
    item['url'] = response.url
    item['canonical']=response.xpath("//link[@rel='canonical' and @href]/@href").extract()
    yield item

Ответы [ 2 ]

0 голосов
/ 03 июля 2019
import scrapy
import pandas as pd
import csv
from scrapy.crawler import CrawlerProcess


class urlsitem(scrapy.Item):
    status=scrapy.Field()
    url=scrapy.Field()
    canonical=scrapy.Field()
    is_matched=scrapy.Field()


class URLSpider(scrapy.Spider):
    handle_httpstatus_list = [301]
    REDIRECT_ENABLED=False
    name = "urls"
    data = ['https://www.wayfair.com/bed-bath/sb0/bedding-c481592.html']
    start_urls =  list(data.iloc[0:,0])


def parse(self, response):
    your_tag = 'XXX'
    item=urlsitem()
    item['status']=response.status
    item['url'] = response.url
    item['canonical']=response.xpath("//link[@rel='canonical' and @href]/@href").extract()
    item['is_matched'] = True if your_tag in response.url else False
    yield item
0 голосов
/ 03 июля 2019

Я не совсем понял ", если URL-ссылка в теге совпадает с URL-адресом веб-сайта ".Если вы пытаетесь создать столбец в файле .csv, который указывает, что найденный URL-адрес совпадает с response.url, вы можете сделать что-то вроде этого:

  • Создать другое двоичное поле с именем is_match

is_match = scrapy.Field()

  • Установите его равным 1, если url и canonical совпадают, в противном случае 0

    item['is_match'] = 1 if item['canonical'] == response.url else 0

Вы можете добиться того же поведения с блоками if-else, но это более элегантно.Это называется троичным оператором.Вы можете увидеть эту страницу для получения дополнительной информации.

Если вы хотите очистить только соответствующие URL-адреса, тогда вы можете поместить блок if в метод parse.

if response.url == response.xpath("//link[@rel='canonical' and @href]/@href").extract():
    item = urlsitem()
    item['status'] = response.status
    item['url'] = response.url
    item['canonical'] = response.xpath("//link[@rel='canonical' and@href]/@href").extract()
    yield item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...