Python Scrapy не выводится в CSV-файл - PullRequest
0 голосов
/ 13 сентября 2018

Что я делаю не так со сценарием, чтобы он не выводил csv-файл с данными? Я запускаю сценарий с scrapy runspider yellowpages.py -o items.csv, и все еще ничего не выходит, кроме пустого файла CSV. Здесь я следил за разными вещами, а также наблюдал, как YouTube пытается выяснить, где я совершаю ошибку, и до сих пор не могу понять, что я делаю неправильно.

# -*- coding: utf-8 -*-
import scrapy
import requests

search = "Plumbers"
location = "Hammond, LA"
url = "https://www.yellowpages.com/search"
q = {'search_terms': search, 'geo_location_terms': location}
page = requests.get(url, params=q)
page = page.url
items = ()


class YellowpagesSpider(scrapy.Spider):
    name = 'quotes'
    allowed_domains = ['yellowpages.com']
    start_urls = [page]

    def parse(self, response):
        self.log("I just visited: " + response.url)
        items = response.css('a[class=business-name]::attr(href)')
        for item in items:
            print(item)

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Простой паук без проекта.

Используйте мой код, я написал комментарии, чтобы его было легче понять. Этот паук ищет все блоки на всех страницах для пары параметров «сервис» и «местоположение». Для запуска используйте:

В вашем случае:

scrapy runspider yellowpages.py -a servise = "Сантехники" -a location = "Хаммонд, Луизиана" -o Hammondsplumbers.csv

Код также будет работать с любыми запросами. Например:

scrapy runspider yellowpages.py -a servise = "Врачи" -a location = "Калифорния, MD" -o MDDoctors.json

и т.д ...

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request
from scrapy.exceptions import CloseSpider


class YellowpagesSpider(scrapy.Spider):
    name = 'yellowpages'
    allowed_domains = ['yellowpages.com']
    start_urls = ['https://www.yellowpages.com/']

    # We can use any pair servise + location on our request
    def __init__(self, servise=None, location=None):
        self.servise = servise
        self.location = location

    def parse(self, response):
        # If "service " and" location " are defined 
        if self.servise and self.location:
            # Create search phrase using "service" and " location"
            search_url = 'search?search_terms={}&geo_location_terms={}'.format(self.servise, self.location)
            # Send request with url "yellowpages.com" + "search_url", then call parse_result
            yield Request(url=response.urljoin(search_url), callback=self.parse_result)
        else:
            # Else close our spider
            # You can add deffault value if you want.
            self.logger.warning('=== Please use keys -a servise="service_name" -a location="location" ===')
            raise CloseSpider()

    def parse_result(self, response):
        # all blocks without AD posts
        posts = response.xpath('//div[@class="search-results organic"]//div[@class="v-card"]')
        for post in posts:
            yield {
                'title': post.xpath('.//span[@itemprop="name"]/text()').extract_first(),
                'url': response.urljoin(post.xpath('.//a[@class="business-name"]/@href').extract_first()),
            }

        next_page = response.xpath('//a[@class="next ajax-page"]/@href').extract_first()
        # If we have next page url
        if next_page:
            # Send request with url "yellowpages.com" + "next_page", then call parse_result
            yield scrapy.Request(url=response.urljoin(next_page), callback=self.parse_result)
0 голосов
/ 13 сентября 2018
for item in items:
    print(item)

поместите урожай вместо печати,

for item in items:
    yield item
0 голосов
/ 13 сентября 2018

При проверке вашего кода я замечаю ряд проблем:

Сначала вы инициализируете items в кортеж, когда он должен быть списком: items = [].

Вам необходимо изменить свойство name, чтобы оно отображало нужное имя на вашем сканере, чтобы вы могли использовать его следующим образом: scrapy crawl my_crawler где name = "my_crawler".

start_urls должен содержать строки, а не Request объекты. Вы должны изменить запись с page на точную строку поиска, которую вы хотите использовать. Если у вас есть несколько строк поиска и вы хотите их перебрать, я бы предложил использовать промежуточное ПО .

Когда вы пытаетесь извлечь данные из CSS, вы забываете вызвать extract_all(), который фактически преобразовал бы ваш селектор в строковые данные, которые вы могли бы использовать.

Кроме того, вы не должны перенаправлять на стандартный поток вывода, потому что там идет много журналирования, и это сделает ваш выходной файл действительно грязным. Вместо этого вы должны извлечь ответы в элементы , используя loaders .

Наконец, вам, вероятно, не хватает подходящих настроек в файле settings.py. Вы можете найти соответствующую документацию здесь .

FEED_FORMAT = "csv"
FEED_EXPORT_FIELDS = ["Field 1", "Field 2", "Field 3"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...