Ham*_*mza 2 python scrapy scrapy-spider
我正在尝试抓取 Booking.Com。蜘蛛打开和关闭而不打开和抓取 url。[输出][1] [1]:https : //i.stack.imgur.com/9hDt6.png 我是 python 和 Scrapy 的新手。这是我到目前为止编写的代码。请指出我做错了什么。
import scrapy
import urllib
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.selector import Selector
from scrapy.item import Item
from scrapy.loader import ItemLoader
from CinemaScraper.items import CinemascraperItem
class trip(CrawlSpider):
name="tripadvisor"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
reviewsurl = response.xpath('//a[@class="show_all_reviews_btn"]/@href')
url = response.urljoin(reviewsurl[0].extract())
self.pageNumber = 1
return scrapy.Request(url, callback=self.parse_reviews)
def parse_reviews(self, response):
for rev in response.xpath('//li[starts-with(@class,"review_item")]'):
item =CinemascraperItem()
#sometimes the title is empty because of some reason, not sure when it happens but this works
title = rev.xpath('.//*[@class="review_item_header_content"]/span[@itemprop="name"]/text()')
if title:
item['title'] = title[0].extract()
positive_content = rev.xpath('.//p[@class="review_pos"]//span/text()')
if positive_content:
item['positive_content'] = positive_content[0].extract()
negative_content = rev.xpath('.//p[@class="review_neg"]/span/text()')
if negative_content:
item['negative_content'] = negative_content[0].extract()
item['score'] = rev.xpath('./*[@class="review_item_header_score_container"]/span')[0].extract()
#tags are separated by ;
item['tags'] = ";".join(rev.xpath('.//ul[@class="review_item_info_tags/text()').extract())
yield item
next_page = response.xpath('//a[@id="review_next_page_link"]/@href')
if next_page:
url = response.urljoin(next_page[0].extract())
yield scrapy.Request(url, self.parse_reviews)
Run Code Online (Sandbox Code Playgroud)
我想指出,在您的问题中,您提到了一个网站booking.com,但在您的蜘蛛中,您有指向该网站的链接,该网站是scrapy 教程的官方文档...将继续使用报价网站为了解释......
好的,我们开始......所以在你的代码片段中你使用了爬行蜘蛛,其中值得一提的是,解析函数已经是爬行蜘蛛背后逻辑的一部分。就像我之前提到的,通过将您的解析重命名为不同的名称,例如 parse_item,这是您创建滚动蜘蛛时的默认初始函数,但实际上您可以随意命名它。通过这样做,我相信我应该真正抓取该网站,但这完全取决于您的代码是否正确。
简而言之,通用蜘蛛和它们爬行蜘蛛之间的区别在于,在使用爬行蜘蛛时,您使用诸如链接提取器和规则之类的模块,其中设置了某些参数,以便在起始 URL 遵循用于导航的模式时通过页面,使用各种有用的论点来做到这一点......其中最后一个规则集是你抛光它们的汽车。iIn 换句话说... crawl spider 创建请求的逻辑以根据需要进行导航。
请注意,在规则集.... 我输入...“/page. ” .... 使用“. ”是一个正则表达式,它说....“来自我所在的页面... anyt 链接遵循模式 ..../page" 的页面"它将遵循 AND 回调到 parse_item..."
这是一个超级简单的例子......因为你可以输入模式来跟随或只是回调你的项目解析函数......
使用普通蜘蛛,您必须手动锻炼站点导航才能获得所需的内容...
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from quotes.items import QuotesItem
class QcrawlSpider(CrawlSpider):
name = 'qCrawl'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']
rules = (
Rule(LinkExtractor(allow=r'page/.*'), callback='parse_item', follow=True),
)
def parse_item(self, response):
item = QuotesItem()
item['quote'] =response.css('span.text::text').extract()
item['author'] = response.css('small.author::text').extract()
yield item
Run Code Online (Sandbox Code Playgroud)
import scrapy
from quotes.items import QuotesItem
class QspiSpider(scrapy.Spider):
name = "qSpi"
allowed_domains = ["quotes.toscrape.com"]
start_urls = ['http://quotes.toscrape.com']
def parse(self, response):
for quote in response.css("div.quote"):
item = QuotesItem()
item['quote'] = quote.css('span.text::text').extract()
item['author'] = quote.css('small.author::text').extract()
item['tags'] = quote.css("div.tags > a.tag::text").extract()
yield item
for nextPage in response.css('li.next a::attr(href)').extract():
yield scrapy.Request(response.urljoin(nextPage))
Run Code Online (Sandbox Code Playgroud)
一种
编辑:OP 要求的附加信息
“...我无法理解如何向规则参数添加参数”
好吧...让我们看看官方文档只是为了重申爬行蜘蛛的定义...
所以爬行蜘蛛通过使用规则集创建跟踪链接背后的逻辑......现在假设我想用爬行蜘蛛爬行 craigslist 只用于待售的家居用品......我希望你注意事情红色的....
第一是显示当我在 craigslist 家居用品页面时
所以我们认为......“search/hsh......”中的任何内容都将是家庭物品列表的页面,从提货页面的第一页开始。
对于大红色数字“2”...是为了表明当我们在实际发布的项目中...所有项目似乎都有“.../hsh/...”以便预览页面内的任何链接有这种模式我想跟随并从那里刮...所以我的蜘蛛会像...
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from craigListCrawl.items import CraiglistcrawlItem
class CcrawlexSpider(CrawlSpider):
name = 'cCrawlEx'
allowed_domains = ['columbia.craigslist.org']
start_urls = ['https://columbia.craigslist.org/']
rules = (
Rule(LinkExtractor(allow=r'search/hsa.*'), follow=True),
Rule(LinkExtractor(allow=r'hsh.*'), callback='parse_item'),
)
def parse_item(self, response):
item = CraiglistcrawlItem()
item['title'] = response.css('title::text').extract()
item['description'] = response.xpath("//meta[@property='og:description']/@content").extract()
item['followLink'] = response.xpath("//meta[@property='og:url']/@content").extract()
yield item
Run Code Online (Sandbox Code Playgroud)
我想让你把它想象成你从登陆页面到你的内容页面所在位置的步骤......所以我们登陆了我们的 start_url 页面......所以我们说 House Hold Items 有一个模式所以正如你所看到的第一条规则......
规则(LinkExtractor(allow=r'search/hsa.*'), follow=True)
这里它说允许遵循正则表达式模式“search/hsa. ”……记住,“. ”是一个正则表达式,至少在这种情况下匹配“search/hsa”之后的任何内容。
所以逻辑继续,然后说任何带有“hsh.*”模式的链接都将被回调到我的 parse_item
如果您将其视为从一个页面到另一个页面的步骤,就“点击”而言,它应该会有所帮助...虽然完全可以接受,但通用蜘蛛将为您提供最大程度的控制,就您的爬虫项目最终将使用的资源而言写得好的蜘蛛应该更精确和更快。
| 归档时间: |
|
| 查看次数: |
3308 次 |
| 最近记录: |