Вывод Scrapy JSON - пустые значения - пробовать xpath - PullRequest
0 голосов
/ 03 октября 2019

Я изменил старый скрипт и запустил его. Однако старые значения ничего не выводили в JSON. Я довольно новичок в утилизации. Я практикую на слом на самом деле. Также, как бы я вытащил ключевое слово, которое я ищу, для «удаленного», чтобы перечислить как «Тип работы». Я также не уверен, если у меня есть правильный URL и правила. Спасибо

Я знаю, что скрипт работает, но мне нужна помощь в ответе css или response.xpath. Я могу найти все значения xpath, но некоторые не работают. xpathing "jobtitle" Я получаю кучу кода / как щелчок мышью. Предоставление кода ..

class IndeedSpider(CrawlSpider):
name = "indeed"
allowed_domains = ["indeed.com"]
start_urls = [
    "https://www.indeed.com/jobs?q=remote&l=",
]


rules = ( 
    Rule(LinkExtractor(allow=('/jobs.q=linux&l=remote&l$','q=linux&l=remote&sort=l&start=[0-9]+$',),deny=('/my/mysearches', '/preferences', '/advanced_search','/my/myjobs')), callback='parse_item', follow=True),


    )

def parse_next_site(self, response):
    item = response.request.meta['item'] 
    item['source_url'] = response.url
    item['source_page_body'] = response.body
    item['crawl_timestamp'] =  time.strftime('%Y-%m-%d %H:%M:%S')



    def parse_item(self, response):
    self.log('\n Crawling  %s\n' % response.url)
    hxs = Selector(response)
    sites = hxs.select("//div[@class='row ' or @class='row lastRow']")
    #sites = hxs.select("//div[@class='row ']")
    items = []
    for site in sites:
        item = IndeedItem(company='none')
        # Producing output with onmouse click. etc. Gets title as well.
        item['job_title'] = site.select("//a[contains(concat(' ', normalize-space(@class), ' '),' jobtitle ')]").extract()
        # link not working
        link_url= site.select('h2/a/@href').extract()
        item['link_url'] = link_url
        item['crawl_url'] = response.url
        item['location'] = site.select("//span[contains(concat(' ', normalize-space(@class), ' '),' location ')]/text()").extract()
        # salary returns ''
        item['salary'] = site.select("//span[contains(concat(' ', normalize-space(@class), ' '),' salaryText ')]").extract()
        # Not all entries have a company. got a lot of , '\n
        if  site.select("//span[contains(concat(' ', normalize-space(@class), ' '),' company ')]/text()").extract() == []:
            item['company'] = [u'']
        else:
            item['company'] = site.select("//span[contains(concat(' ', normalize-space(@class), ' '),' company ')]/text()").extract()
                    # Summary seems to work
            item['summary'] = site.select("//div[contains(concat(' ', normalize-space(@class), ' '),' summary ')]").extract()
        item['source'] = site.select("table/tr/td/span[@class='source']/text()").extract()
        item['found_date'] = site.select("table/tr/td/span[@class='date']/text()").extract()
        #item['source_url'] = self.get_source(link_url)
        request = Request("http://www.indeed.com" +   item['link_url'][0], callback=self.parse_next_site)
    request.meta['item'] = item
    yield request
    items.append(item)
    return


SPIDER=IndeedSpider()

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

1 Ответ

1 голос
/ 04 октября 2019

при переборе селекторов scrapy с помощью xpath, использующего «.//myxpath» для использования реального пути, вы можете посмотреть здесь пример кода, надеясь, что это поможет:)

from scrapy.spiders import CrawlSpider
from scrapy.http import Request, Response
from scrapy.linkextractors import LinkExtractor
import time


class IndeedSpider(CrawlSpider):
    name = "indeed"
    allowed_domains = ["indeed.com"]
    start_urls = [
        "https://www.indeed.com/jobs?q=remote&l=",
    ]

    def start_requests(self):
        for link in IndeedSpider.start_urls:
            yield Request(url=link, callback=self.parse_site)

    def parse_site(self, response: Response):
        extracted_links = LinkExtractor(
            allow=['/jobs.q=linux&l=remote&l$', 'q=linux&l=remote&sort=l&start=[0-9]+$'],
            deny=['/my/mysearches', '/preferences', '/advanced_search', '/my/myjobs']) \
            .extract_links(response)

        for link in extracted_links:
            yield Request(url=link.url, callback=self.parse_item)

    def parse_item(self, response: Response):
        self.log('\n Crawling  %s\n' % response.url)
        sites = response.xpath("//div[@class='row ' or @class='row lastRow']")
        # sites = hxs.select("//div[@class='row ']")
        items = []
        for site in sites:
            item = IndeedItem(company='none')
            # Producing output with onmouse click. etc. Gets title as well.

            # when Iterating over selectors use .// to use a relative xpath
            item['job_title'] = site.xpath(".//a[has-class('jobtitle')]").get()
            # link not working
            link_url = site.xpath('.//h2/a/@href').get()
            item['link_url'] = link_url
            item['crawl_url'] = response.url
            item['location'] = site.xpath(".//span[has-class('location')]/text()").get()
            # salary returns ''
            item['salary'] = site.xpath(".//span[has-class('salaryText')]").get()
            # Not all entries have a company. got a lot of , '\n
            if not site.xpath(".//span[has-class('company')]/text()").getall():
                item['company'] = [u'']
            else:
                item['company'] = site.xpath(".//span[has-class('company')/text()").get()
                # Summary seems to work
                item['summary'] = site.xpath("//div[has-class('summary')]").get()
            item['source'] = site.xpath(".//table/tr/td/span[@class='source']/text()").get()
            item['found_date'] = site.xpath(".//table/tr/td/span[@class='date']/text()").get()
            # item['source_url'] = self.get_source(link_url)
            request = Request("http://www.indeed.com" + item['link_url'][0], callback=self.parse_next_site)
            request.meta['item'] = item
            yield request
            items.append(item)

    def parse_next_site(self, response: Response):
        item = response.request.meta['item']
        item['source_url'] = response.url
        item['source_page_body'] = response.body
        item['crawl_timestamp'] = time.strftime('%Y-%m-%d %H:%M:%S')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...