代码来源:http://mherman.org/blog/2012/11/08/recursively-scraping-web-pages-with-scrapy/#rules 我是python和scrapy的新手。我搜索了递归蜘蛛并找到了它。
我有几个问题:
以下是如何运作的?它只是从页面中获取href链接并将其添加到请求队列中吗?
网页的哪一部分可以进行scrapy抓取?
以下代码是否从网页上抓取了所有链接?
假设我想抓取并下载此网站http://downloads.trendnet.com/
中的每个文件我可能会这样做的方法是抓取本网站上的每个链接并检查URL的内容标题并下载(如果它是文件)。这可行吗?
对不起,如果这是一个糟糕的问题......
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from craigslist_sample.items import CraigslistSampleItem
class MySpider(CrawlSpider):
name = "craigs"
allowed_domains = ["sfbay.craigslist.org"]
start_urls = ["http://sfbay.craigslist.org/search/npo"]
rules = (
Rule(SgmlLinkExtractor(allow=(), restrict_xpaths=('//a[@class="button next"]',)), callback="parse_items", follow= True),
)
def parse_items(self, response):
hxs = HtmlXPathSelector(response)
titles = hxs.xpath('//span[@class="pl"]')
items = []
for titles in titles:
item = CraigslistSampleItem()
item["title"] = titles.xpath("a/text()").extract()
item["link"] = titles.xpath("a/@href").extract()
items.append(item)
return(items)
答案 0 :(得分:0)
我认为RTFM在这里真的很适用,但是给你一个简短的答案:
关于给出的示例
rules = (
Rule(SgmlLinkExtractor(allow=(), restrict_xpaths=('//a[@class="button next"]',)), callback="parse_items", follow= True),
)
你问它抓什么。它只会抓取您在规则下设置的内容。这意味着您的机器人每次只抓取下一页。对于它找到的每个页面,它执行:callback = parse_items。
def parse_items(self, response):
hxs = HtmlXPathSelector(response)
titles = hxs.xpath('//span[@class="pl"]')
items = []
for titles in titles:
item = CraigslistSampleItem()
item["title"] = titles.xpath("a/text()").extract()
item["link"] = titles.xpath("a/@href").extract()
items.append(item)
return(items)
在这种情况下,parse_items的作用是检查列表中的条目。您可以通过xpath定义列表(如上面的titles = hxs.xpath('//span[@class="pl"]')
所示)。对于列表中的每个条目(即for titles in titles:
),它将文本和链接复制到项目中。然后它返回项目(也就是它已经完成)。
Praw_items是通过跟随下一个按钮为抓取工具找到的每个页面完成的。
在设置下,您可以添加DEPTH_LIMIT=3
。在这种情况下,您的爬虫蜘蛛只会爬3深。
关于您发布的网站:
不,你不需要爬虫,因为没有多个页面。普通的基础蜘蛛就足够了。然而,爬虫可以工作,我会在下面显示一些内容。将规则设置为restrict_xpath(' // a',),然后按照页面上的所有链接进行操作。
确保您的item.py包含所有必需的项目。例如,下面指的是项目[" link"]。在你的item.py中,确保包含一个名为link(caps-sensitive)的项目,即确保line - link = Field() - 在那里。
在parse_items下,执行以下操作:
def parse_items(self, response):
list = response.xpath('//a"')
items = []
for titles in list:
item = [INSERT WHATEVER YOU CALLED YOUR ITEM]
item["title"] = titles.xpath("/text()").extract()
item["link"] = titles.xpath("/@href").extract()
if ".pdf" in item["link"]:
SEE COMMENT BELOW
return(items)
您需要做的最后一点是检查项目管道的工作方式。它在您的项目中使用file_urls等。