我正在尝试制作一个抓取工具,以拖动craigslist上的链接,标题,价格和帖子正文。我已经能够获得价格,但是它返回页面上每个列表的价格,而不仅是特定行的价格。我也无法将其转到下一页并继续抓取。
这是我正在使用的教程-http: //mherman.org/blog/2012/11/08/recursively-scraping-web-pages-with-scrapy/
我已经尝试过此线程的建议,但仍然无法使它起作用-Scrapy Python Craigslist Scraper
我要抓取的页面是-http: //medford.craigslist.org/cto/
在链接价格变量中,如果我在span [@ class =“ l2”]之前删除//,则不会返回任何价格,但是如果我将其保留在那里,则它将包含页面上的所有价格。
对于规则,我尝试使用class标签,但是它似乎挂在第一页上。我在想可能需要单独的蜘蛛类?
这是我的代码:
#-------------------------------------------------------------------------------
# Name: module1
# Purpose:
#
# Author: CD
#
# Created: 02/03/2014
# Copyright: (c) CD 2014
# Licence: <your licence>
#-------------------------------------------------------------------------------
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from craigslist_sample.items import CraigslistSampleItem
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.http import Request
from scrapy.selector import *
import sys
class PageSpider(BaseSpider):
name = "cto"
allowed_domains = ["medford.craigslist.org"]
start_urls = ["http://medford.craigslist.org/cto/"]
rules = (Rule(SgmlLinkExtractor(allow=("index\d00\.html", ), restrict_xpaths=('//span[@class="button next"]' ,))
, callback="parse", follow=True), )
def parse(self, response):
hxs = HtmlXPathSelector(response)
titles = hxs.select('//span[@class="pl"] | //span[@class="l2"]')
for title in titles:
item = CraigslistSampleItem()
item['title'] = title.select("a/text()").extract()
item['link'] = title.select("a/@href").extract()
item['price'] = title.select('//span[@class="l2"]//span[@class="price"]/text()').extract()
url = 'http://medford.craigslist.org{}'.format(''.join(item['link']))
yield Request(url=url, meta={'item': item}, callback=self.parse_item_page)
def parse_item_page(self, response):
hxs = HtmlXPathSelector(response)
item = response.meta['item']
item['description'] = hxs.select('//section[@id="postingbody"]/text()').extract()
return item
这个想法很简单:在中找到所有div
带有的段落class="content"
。然后从每个段落中提取链接,文本链接和价格。请注意,该select()
方法不建议使用currentlty,请xpath()
改用。
这是parse()
方法的修改版本:
def parse(self, response):
hxs = HtmlXPathSelector(response)
rows = hxs.select('//div[@class="content"]/p[@class="row"]')
for row in rows:
item = CraigslistSampleItem()
link = row.xpath('.//span[@class="pl"]/a')
item['title'] = link.xpath("text()").extract()
item['link'] = link.xpath("@href").extract()
item['price'] = row.xpath('.//span[@class="l2"]/span[@class="price"]/text()').extract()
url = 'http://medford.craigslist.org{}'.format(''.join(item['link']))
yield Request(url=url, meta={'item': item}, callback=self.parse_item_page)
这是我得到的样本:
{'description': [u"\n\t\tHave a nice, sturdy, compact car hauler/trailer. May be used for other hauling like equipstment, ATV's and the like, Very solid and in good shape. Parice to sell at only $995. Call Bill at 541 944 2929 top see or Roy at 541 9733421. \n\t"],
'link': [u'/cto/4354771900.html'],
'price': [u'$995'],
'title': [u'compact sturdy car trailer ']}
希望能有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句