【发布时间】:2021-09-12 12:37:18
【问题描述】:
我想抓取一些网站,看看那里是否存在“katalog”一词。如果是,我想检索该单词所在的所有选项卡/子页面的链接。有可能吗?
我尝试按照本教程进行操作,但最后得到的 wordlist.csv 是空的,即使网站上确实存在单词 catalog。
https://www.phooky.com/blog/find-specific-words-on-web-pages-with-scrapy/
wordlist = [
"katalog",
"downloads",
"download"
]
def find_all_substrings(string, sub):
starts = [match.start() for match in re.finditer(re.escape(sub), string)]
return starts
class WebsiteSpider(CrawlSpider):
name = "webcrawler"
allowed_domains = ["www.reichelt.com/"]
start_urls = ["https://www.reichelt.com/"]
rules = [Rule(LinkExtractor(), follow=True, callback="check_buzzwords")]
crawl_count = 0
words_found = 0
def check_buzzwords(self, response):
self.__class__.crawl_count += 1
crawl_count = self.__class__.crawl_count
url = response.url
contenttype = response.headers.get("content-type", "").decode('utf-8').lower()
data = response.body.decode('utf-8')
for word in wordlist:
substrings = find_all_substrings(data, word)
print("substrings", substrings)
for pos in substrings:
ok = False
if not ok:
self.__class__.words_found += 1
print(word + ";" + url + ";")
return Item()
def _requests_to_follow(self, response):
if getattr(response, "encoding", None) != None:
return CrawlSpider._requests_to_follow(self, response)
else:
return []
如何在网站上找到一个单词的所有实例并获取该单词所在页面的链接?
【问题讨论】:
-
您发送空项目
return Item(),因此您得到空文件。您至少应该在yield目录中包含for-loop 中的数据 - 比如yield {"word": word, "url": url}。 -
我不明白你为什么使用
__class__。您可以在开始时创建wordlist- 甚至在课外。无需一次又一次地创建相同的列表。你可以在开始时使用import re。无需一次又一次地导入它。当所有导入都在开头时,其他人可以看到运行此代码需要哪些模块。 -
但首先您应该在网络浏览器中关闭 JavaScript 并在网络浏览器中加载您的页面。你会看到
scrapy可以从页面得到什么——因为scrapy不能运行JavaScript。如果页面使用 JavaScript 添加项目,那么您将需要 Selenium 或 Splash 来控制可以运行 JavaScript 的 Web 浏览器。见Scrapy-Selenium 和Scrapy-Splash -
此页面向我显示英文文本,它没有
katalog,而是catalog。我必须使用https://www.reichelt.com/?LANGUAGE=PL来获取带有katalog的波兰语页面 -
我经历了scrapy selenium,但我真的不知道如何在我的情况下使用它。我可以在我现有的代码中添加一个步骤,以便首先关闭 javascript,然后我们查找这些单词吗?此外,我尝试在现有代码中使用
"https://www.reichelt.com/?LANGUAGE=PL",但我没有看到任何子字符串的打印语句。 @furas
标签: python python-3.x web-scraping scrapy web-crawler