【发布时间】:2020-10-24 22:48:27
【问题描述】:
我对 python 和 scrapy 非常陌生,因此决定尝试构建一个蜘蛛,而不是仅仅害怕新的/具有挑战性的语言。
所以这是第一个蜘蛛,它的目的:
- 它贯穿网站的页面(通过它在每个页面上找到的链接) 页)
- 列出每个页面上存在的所有链接(a>href)
- 在每一行中写下:找到链接的页面,链接本身 (解码+语言)、每个页面上的链接数以及每个链接的 http 响应代码。
我遇到的问题是它永远不会停止抓取,它似乎陷入了一个循环,并且总是重新抓取每个页面不止一次......
我做错了什么? (显然很多事情,因为我以前从未写过python代码,但仍然如此) 如何让蜘蛛只抓取每个页面一次?
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
import urllib.parse
import requests
import threading
class TestSpider(CrawlSpider):
name = "test"
allowed_domains = ["cerve.co"]
start_urls = ["https://cerve.co"]
rules = [Rule (LinkExtractor(allow=['.*'], tags='a', attrs='href'), callback='parse_item', follow=True)]
def parse_item(self, response):
alllinks = response.css('a::attr(href)').getall()
for link in alllinks:
link = response.urljoin(link)
yield {
'page': urllib.parse.unquote(response.url),
'links': urllib.parse.unquote(link),
'number of links': len(alllinks),
'status': requests.get(link).status_code
}
【问题讨论】:
-
你可以试试链接提取器的这个属性:唯一(布尔值)——是否应该对提取的链接应用重复过滤。如果不起作用,您可以使用“process_links”回调过滤链接
-
感谢@akash,我尝试添加这样的独特部分:rules = [Rule (LinkExtractor(allow=['.*'], tags='a', attrs='href', unique =True), callback='parse_item', follow=True)] 它不起作用。关于使用流程链接,您如何使用它来过滤重复项?或者如果有一个很好的教程或指南可以帮助我,我很感激:)
标签: python web-scraping scrapy