Школьное задание
написал пользовательский паук для извлечения нескольких элементов со страницы - идея состоит в том, чтобы извлечь роль, компанию и местоположение вакансии из
https://stackoverflow.com/jobs?med=site-ui&ref=jobs-tab
пытался следовать https://www.accordbox.com/blog/scrapy-tutorial-10-how-build-real-spider/, чтобы создать паука для другого сайта
это код, с которым я работаю. На самом деле больше не уверен, где вносить изменения
class JobDetail(Item):
title = scrapy.Field()
company = scrapy.Field()
location = scrapy.Field()
class JobItems(Spider):
name = 'JobItems'
allowed_domains = ['stackoverflow.com']
start_urls = ['https://stackoverflow.com/jobs']
def parse(self, response):
yield Request('https://stackoverflow.com/jobs', callback=self.parse_details)
def parse_details(self, response):
jobs = response.xpath('//div[@class="-job-summary"]')
for job in jobs:
job = JobDetail()
job['title'] = job.xpath('.//*[@class="s-link s-link__visited"]').extract()
job['company'] = job.xpath('.//div[@class="fc-black-700 fs-body2 -company"]//span[1]/text()').extract()
job['location'] = job.xpath('.//div[@class="fc-black-700 fs-body2 -company"]//span[2]/text()').extract()
yield jobs
ничего не возвращается с кодом выше
class JobDetail(Item):
title = scrapy.Field()
company = scrapy.Field()
location = scrapy.Field()
class JobItems(Spider):
name = 'JobItems'
allowed_domains = ['stackoverflow.com']
start_urls = ['https://stackoverflow.com/jobs']
def parse(self, response):
yield Request('https://stackoverflow.com/jobs', callback=self.parse_details)
process = CrawlerProcess({'USER_AGENT': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 \
(KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17'})
def parse_details(self, response):
jobs = response.xpath('//div[@class="-job-summary"]')
for job in jobs:
job = JobDetail()
job['title'] = job.xpath('.//*[@class="s-link s-link__visited"]').extract()
job['company'] = job.xpath('.//div[@class="fc-black-700 fs-body2 -company"]//span[1]/text()').extract()
job['location'] = job.xpath('.//div[@class="fc-black-700 fs-body2 -company"]//span[2]/text()').extract()
yield jobs
process.crawl(JobItems)
Нулевые объекты с кодом выше
2019-07-06 20:47:06 [scrapy.utils.log] INFO: Scrapy 1.6.0 started (bot: scrapybot)
2019-07-06 20:47:06 [scrapy.utils.log] INFO: Versions: lxml 4.2.6.0, libxml2 2.9.8, cssselect 1.0.3, parsel 1.5.1, w3lib 1.20.0, Twisted 19.2.1, Python 3.6.8 (default, Jan 14 2019, 11:02:34) - [GCC 8.0.1 20180414 (experimental) [trunk revision 259383]], pyOpenSSL 19.0.0 (OpenSSL 1.1.1c 28 May 2019), cryptography 2.7, Platform Linux-4.14.79+-x86_64-with-Ubuntu-18.04-bionic
2019-07-06 20:47:06 [scrapy.crawler] INFO: Overridden settings: {'USER_AGENT': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 \\\n (KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17'}
2019-07-06 20:47:06 [scrapy.extensions.telnet] INFO: Telnet Password: dc701a1b667b9026
2019-07-06 20:47:06 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
'scrapy.extensions.telnet.TelnetConsole',
'scrapy.extensions.memusage.MemoryUsage',
'scrapy.extensions.logstats.LogStats']
2019-07-06 20:47:06 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
'scrapy.downloadermiddlewares.retry.RetryMiddleware',
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
'scrapy.downloadermiddlewares.stats.DownloaderStats']
2019-07-06 20:47:06 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
'scrapy.spidermiddlewares.referer.RefererMiddleware',
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
'scrapy.spidermiddlewares.depth.DepthMiddleware']
2019-07-06 20:47:06 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2019-07-06 20:47:06 [scrapy.core.engine] INFO: Spider opened
2019-07-06 20:47:06 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-07-06 20:47:06 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6028
<Deferred at 0x7f595e7570f0>
изменения основаны на предложении @abdusco - тот же результат
class JobDetail(Item):
title = scrapy.Field()
company = scrapy.Field()
location = scrapy.Field()
class JobItems(Spider):
name = 'JobItems'
allowed_domains = ['stackoverflow.com']
start_urls = ['https://stackoverflow.com/jobs']
def parse_details(self, response):
jobs = response.xpath('//div[@class="-job-summary"]')
for job in jobs:
job = JobDetail()
job['title'] = job.xpath('.//*[@class="s-link s-link__visited"]').extract()
job['company'] = job.xpath('.//div[@class="fc-black-700 fs-body2 -company"]//span[1]/text()').extract()
job['location'] = job.xpath('.//div[@class="fc-black-700 fs-body2 -company"]//span[2]/text()').extract()
yield jobs
def parse(self, response):
yield Request('https://stackoverflow.com/jobs', callback=self.parse_details)
process = CrawlerProcess({'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'})
process.crawl(JobItems)