как получить проанализированный элемент из одной ссылки с другими проанализированными элементами из других ссылок в том же списке элементов - PullRequest
1 голос
/ 02 апреля 2019

Проблема в том, что я перебирал список мест, чтобы очистить широту и долготу.Дело в том, что когда я получаю то, что отсканировал назад, у меня нет возможности связать его с моим текущим df, поскольку итерированные имена могут быть изменены или пропущены.

Мне удалось получить имято, что я посмотрел, но поскольку он анализировал извне ссылку на остальные элементы, он не работает должным образом.

import scrapy
import pandas as pd
from ..items import latlonglocItem


df = pd.read_csv('wine_df_final.csv')
df = df[pd.notnull(df.real_place)]
real_place = list(set(df.real_place))


class latlonglocSpider(scrapy.Spider):


    name = 'latlonglocs'
    start_urls = []


    for place in real_place:
        baseurl =  place.replace(',', '').replace(' ', '+')
        cleaned_href = f'http://www.google.com/search?q={baseurl}+coordinates+latitude+longitude+distancesto'
        start_urls.append(cleaned_href)



    def parse(self, response):

        items = latlonglocItem()

        items['base_name'] = response.xpath('string(/html/head/title)').get().split(' coordinates')[0]
        for href in response.xpath('//*[@id="ires"]/ol/div/h3/a/@href').getall():
            if href.startswith('/url?q=https://www.distancesto'):
                yield response.follow(href, self.parse_distancesto)
            else:
                pass
        yield items

    def parse_distancesto(self, response):
        items = latlonglocItem()

        try:
            items['appellation'] = response.xpath('string(/html/body/div[3]/div/div[2]/div[3]/div[2]/p/strong)').get()
            items['latitude'] = response.xpath('string(/html/body/div[3]/div/div[2]/div[3]/div[3]/table/tbody/tr[1]/td)').get()
            items['longitude'] = response.xpath('string(/html/body/div[3]/div/div[2]/div[3]/div[3]/table/tbody/tr[2]/td)').get()
            items['elevation'] = response.xpath('string(/html/body/div[3]/div/div[2]/div[3]/div[3]/table/tbody/tr[10]/td)').get()
            yield items
        except Exception:
            pass
#output
 appellation      base_name       elevation    latitude    longitude
                  Chalone, USA
 Santa Cruz, USA                  56.81        35           9.23 

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

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019
import scrapy
import pandas as pd
from ..items import latlonglocItem


df = pd.read_csv('wine_df_final.csv')
df = df[pd.notnull(df.real_place)]
real_place = list(set(df.real_place))


class latlonglocSpider(scrapy.Spider): # latlonglocSpider is a child class of scrapy.Spider

    name = 'latlonglocs'
    start_urls = []

    for place in real_place:
        baseurl =  place.replace(',', '').replace(' ', '+')
        cleaned_href = f'http://www.google.com/search?q={baseurl}+coordinates+latitude+longitude+distancesto'
        start_urls.append(cleaned_href)

    def __init__(self): # Constructor for our class
        # Since we did our own constructor we need to call the parents constructor
        scrapy.Spider.__init__(self)
        self.base_name = None # Here is the base_name we can now use class wide

    def parse(self, response):

        for href in response.xpath('//*[@id="ires"]/ol/div/h3/a/@href').getall():

            if href.startswith('/url?q=https://www.distancesto'):
                self.base_name = response.xpath('string(/html/head/title)').get().split(' coordinates')[0]

                yield response.follow(href, self.parse_distancesto)
            else:
                pass

    def parse_distancesto(self, response):
        items = latlonglocItem()

        try:
            # If for some reason self.base_name is never assigned in
            # parse() then we want to use an empty string instead of the self.base_name

            # The following syntax means use self.base_name unless it is None or empty
            # in which case just use and empty string.
            items['base_name'] = self.base_name or "" # If for some reason
            items['appellation'] = response.xpath('string(/html/body/div[3]/div/div[2]/div[3]/div[2]/p/strong)').get()
            items['latitude'] = response.xpath('string(/html/body/div[3]/div/div[2]/div[3]/div[3]/table/tbody/tr[1]/td)').get()
            items['longitude'] = response.xpath('string(/html/body/div[3]/div/div[2]/div[3]/div[3]/table/tbody/tr[2]/td)').get()
            items['elevation'] = response.xpath('string(/html/body/div[3]/div/div[2]/div[3]/div[3]/table/tbody/tr[10]/td)').get()
            yield items
        except Exception:
            pass

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

0 голосов
/ 02 апреля 2019

Это может сработать. Я прокомментирую и то, что я делаю, и немного вашего кода, вы понимаете, что я делаю.

import scrapy
import pandas as pd
from ..items import latlonglocItem


df = pd.read_csv('wine_df_final.csv')
df = df[pd.notnull(df.real_place)]
real_place = list(set(df.real_place))


class latlonglocSpider(scrapy.Spider): # latlonglocSpider is a child class of scrapy.Spider

    name = 'latlonglocs'
    start_urls = []

    for place in real_place:
        baseurl =  place.replace(',', '').replace(' ', '+')
        cleaned_href = f'http://www.google.com/search?q={baseurl}+coordinates+latitude+longitude+distancesto'
        start_urls.append(cleaned_href)

    def __init__(self): # Constructor for our class
        # Since we did our own constructor we need to call the parents constructor
        scrapy.Spider.__init__(self)
        self.base_name = None # Here is the base_name we can now use class wide

    def parse(self, response):

        items = latlonglocItem()

        items['base_name'] = response.xpath('string(/html/head/title)').get().split(' coordinates')[0]
        self.base_name = items['base_name'] # Lets store the base_name in the class
        for href in response.xpath('//*[@id="ires"]/ol/div/h3/a/@href').getall():
            if href.startswith('/url?q=https://www.distancesto'):
                yield response.follow(href, self.parse_distancesto)
            else:
                pass
        yield items

    def parse_distancesto(self, response):
        items = latlonglocItem()

        try:
            # If for some reason self.base_name is never assigned in
            # parse() then we want to use an empty string instead of the self.base_name

            # The following syntax means use self.base_name unless it is None or empty
            # in which case just use and empty string.
            base_name = self.base_name or "" # If for some reason

            items['appellation'] = response.xpath('string(/html/body/div[3]/div/div[2]/div[3]/div[2]/p/strong)').get()
            items['latitude'] = response.xpath('string(/html/body/div[3]/div/div[2]/div[3]/div[3]/table/tbody/tr[1]/td)').get()
            items['longitude'] = response.xpath('string(/html/body/div[3]/div/div[2]/div[3]/div[3]/table/tbody/tr[2]/td)').get()
            items['elevation'] = response.xpath('string(/html/body/div[3]/div/div[2]/div[3]/div[3]/table/tbody/tr[10]/td)').get()
            yield items
        except Exception:
            pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...