所以我一直在尝试使用Scrapy和Craigslist Jobs网站找到一个语法参考指南来完成一个基本的屏幕刮刀工具。这只是为了练习,因为我更多地学习Scrapy并进入更复杂的项目 - 跳页,填写搜索表单等。
这是Scrapy的代码:
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from craigslist_sample.items import CraigslistSampleItem
class MySpider(BaseSpider):
name = "craig"
allowed_domains = ["craigslist.org"]
start_urls = ["https://gainesville.craigslist.org/search/jjj"]
def parse(self, response):
hxs = HtmlXPathSelector(response)
titles = hxs.select("//p")
items = []
for titles in titles:
item = CraigslistSampleItem()
item ["title"] = titles.select("").extract()
item ["link"] = titles.select("a/@href").extract()
items.append(item)
return items
显然,正如你所看到的,我有一个craiglist样本项python文件,其中包含标题和链接的元素。我似乎无法弄清楚第16行:我试图抓取的元素的XPath - 这是Craiglist发布的标题。
我对该链接的XPath有效,它位于
之下 <p><a href='URL'>
在craigslist帖子中。
craigslist发布标题位于:
<p><span><span><a class="hdrlnk">Example Job Description</a>
我搞砸了它,我已经能够获得hdrlnk和'1'标题的输出。我不确定我做错了什么。任何帮助将不胜感激!
作为奖励,有谁知道我会如何告诉Scrapy转到下一页并运行相同的脚本?
谢谢!
答案 0 :(得分:0)
你可以尝试一下,
BASE_URL = 'https://gainesville.craigslist.org'
titles = response.xpath('//p[@class="row"]')
for title in titles:
# extracting the title
name = title.xpath('.//a[@class="hdrlnk"]/text()').extract()
# cleaning the data
name = name[0].strip() if name else 'N/A'
link = title.xpath('.//a[@class="hdrlnk"]/@href').extract()
link = BASE_URL + link[0].strip() if link else 'N/A
item = CraigslistSampleItem(title=name, link=link)
yield items
如果你想要分页,那么完整的代码将会是,
def parse(self, response):
BASE_URL = 'https://gainesville.craigslist.org'
titles = response.xpath('//p[@class="row"]')
for title in titles:
# extracting the title
name = title.xpath('.//a[@class="hdrlnk"]/text()').extract()
# cleaning the data
name = name[0].strip() if name else 'N/A'
link = title.xpath('.//a[@class="hdrlnk"]/@href').extract()
link = BASE_URL + link[0].strip() if link else 'N/A
item = CraigslistSampleItem(title=name, link=link)
yield items
next_page = response.xpath('//a[@class="button next"]/@href').extract()
if next_page:
next_page_url = BASE_URL + next_page[0].strip()
yield Request(url=next_page_url, callback=self.parse)