我正在尝试制作一种工具,该工具应该从网站获取每个链接。 例如,我需要从stackoverflow获取所有问题页面。 我尝试过使用scrapy。
class MySpider(CrawlSpider):
name = 'myspider'
start_urls = ['https://stackoverflow.com/questions/']
def parse(self, response):
le = LinkExtractor()
for link in le.extract_links(response):
url_lnk = link.url
print (url_lnk)
在这里,我仅从开始页面收到问题。我需要做些什么才能获得所有“问题”链接。时间无所谓,我只需要了解该怎么做。
UPD
我要观察的站点是f-strings-这是一个本地城市新闻网站。
所有新闻的列表应包含在此处:https://sevastopol.su/
在此页面的底部,您可以看到页码,但是如果转到新闻的最后一页,我们将看到它的编号为765(现在是2019年6月19日),但显示的是最新的日期时间为2018年6月19日。因此最后一页仅显示了一年的新闻。但是,还有很多新闻链接仍然存在(可能从2010年开始),甚至可以在该网站的搜索页面中找到。 因此,这就是为什么我想知道是否可以访问该站点的某些全局链接存储。
答案 0 :(得分:2)
这可能是您要获取所有指向不同问题的链接的方法。但是,我想您的脚本可能在执行过程中某处出现404错误,因为有数百万个链接需要解析。
按照以下方式运行脚本:
import scrapy
class StackOverflowSpider(scrapy.Spider):
name = 'stackoverflow'
start_urls = ["https://stackoverflow.com/questions/"]
def parse(self, response):
for link in response.css('.summary .question-hyperlink::attr(href)').getall():
post_link = response.urljoin(link)
yield {"link":post_link}
next_page = response.css("a[rel='next']::attr(href)").get()
if next_page:
next_page_url = response.urljoin(next_page)
yield scrapy.Request(next_page_url,callback=self.parse)
答案 1 :(得分:0)
您应该编写一个正则表达式(或类似的搜索功能),以查找具有特定类的<a>
标签(在这种情况下:class="question-hyperlink"
)并使用href
这些元素的属性。这将从当前页面获取所有链接。
然后,您还可以搜索页面链接(在底部)。在这里,您看到这些链接是/questions?sort=active&page=<pagenumber>
,您可以在其中更改要抓取页面的<pagenumber>
。 (例如,使循环从1
开始,一直持续到出现404错误为止。
答案 2 :(得分:0)
您的蜘蛛现在会发出抓取后续页面的请求
from scrapy.spiders import CrawlSpider
from scrapy import Request
from urllib.parse import urljoin
class MySpider(CrawlSpider):
name = 'myspider'
start_urls = ['https://sevastopol.su/all-news']
def parse(self, response):
# This method is called for every successfully crawled page
# get all pagination links using xpath
for link in response.xpath("//li[contains(@class, 'pager-item')]/a/@href").getall():
# build the absolute url
url = urljoin('https://sevastopol.su/', link)
print(url)
yield Request(url=url, callback=self.parse) # <-- This makes your spider recursiv crawl subsequent pages
请注意,您不必担心多次请求相同的url。重复删除(默认设置)。
下一步:
配置Scrapy(例如,用户代理,抓取延迟等):https://docs.scrapy.org/en/latest/topics/settings.html
处理错误(错误):https://docs.scrapy.org/en/latest/topics/request-response.html
使用项目标点线存储您的URL等:https://docs.scrapy.org/en/latest/topics/item-pipeline.html