我正在尝试编写一个蜘蛛来根据索引页面上的数据或信息抓取某些页面。然后将结果存储在数据库中。
例如,假设我想抓取stackoverflow.com/questions/tagged/scrapy 我会浏览索引页面,如果问题不在我的数据库中,那么我会将答案计数存储在数据库中,然后按照问题的链接抓取该页面。
如果问题已经在数据库中,但答案的数量大于数据库中的答案:再次抓取该页面。
如果问题已经在数据库中并且答案计数器是相同的:跳过这个问题。
目前,我可以在索引页面上获取所有链接并回答计数(在此示例中)。 但我不知道如何让蜘蛛根据答案计数跟随问题页面的链接。
有没有办法用一只蜘蛛而不是两只蜘蛛做到这一点,一只蜘蛛获取索引页面上的所有链接,将数据与数据库进行比较,导出json或csv文件,然后将其传递给另一个爬行问题页面的蜘蛛?
答案 0 :(得分:0)
这是CrawlSpider和规则的作用(请务必查看示例)。您可以首先从索引站点获取信息(尽管您的方法计算答案存在某些缺陷:如果用户删除了帖子并添加了新帖子,并决定每个子页面,如果您想获取其信息或不
简单说明:在索引页面上使用蜘蛛并按照其问题进行操作。在提出问题时,请检查您是否要获取信息或drop/ignore the question。
答案 1 :(得分:0)
只需使用BaseSpider。这样,您可以使所有逻辑取决于您正在抓取的内容。我个人更喜欢BaseSpider,因为它可以让你更好地控制抓取过程。
蜘蛛应该看起来像这样(这更像是一个伪代码):
from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider
from scrapy.http import Request
from myproject.items import MyItem
class StackOverflow(BaseSpider):
name = 'stackoverflow.com'
allowed_domains = ['stackoverflow.com']
start_urls = ['http://stackoverflow.com/questions']
def parse(self, response):
hxs = HtmlXPathSelector(response)
for question in hxs.select('//question-xpath'):
question_url = question.select('./question-url')
answer_count = question.select('./answer-count-xpath')
# you'll have to write the xpaths and db logic yourself
if get_db_answer_count(question_url) != answer_count[0]:
yield Request(question_url, callback = self.parse_question)
def parse_question(self, response):
insert_question_and_answers_into_db
pass