- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想抓取一些网站,看看那里是否有“katalog”这个词。如果是,我想检索该词所在的所有选项卡/子页面的链接。有可能这样做吗?
我尝试按照本教程进行操作,但最终得到的 wordlist.csv 是空的,即使网站上确实存在“目录”一词。
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 []
如何在网站上找到一个词的所有实例并获得该词所在页面的链接?
最佳答案
主要问题是错误allowed_domain
- 它必须没有路径 /
allowed_domains = ["www.reichelt.com"]
其他问题可能是本教程已经 3 年了(有指向 Scarpy
1.5
文档的链接,但最新版本是
2.5.0
)。
contenttype
但千万不要用它来
decode
request.body
.您的网址使用
iso8859-1
用于原始语言和
utf-8
为
?LANGUAGE=PL
- 但你可以简单地使用
request.text
它会自动解码。
ok = False
后来检查它,但它完全没用。
python script.py
运行无需创建项目。
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
import re
wordlist = [
"katalog",
"catalog",
"downloads",
"download",
]
def find_all_substrings(string, sub):
return [match.start() for match in re.finditer(re.escape(sub), string)]
class WebsiteSpider(CrawlSpider):
name = "webcrawler"
allowed_domains = ["www.reichelt.com"]
start_urls = ["https://www.reichelt.com/"]
#start_urls = ["https://www.reichelt.com/?LANGUAGE=PL"]
rules = [Rule(LinkExtractor(), follow=True, callback="check_buzzwords")]
#crawl_count = 0
#words_found = 0
def check_buzzwords(self, response):
print('[check_buzzwords] url:', response.url)
#self.crawl_count += 1
#content_type = response.headers.get("content-type", "").decode('utf-8').lower()
#print('content_type:', content_type)
#data = response.body.decode('utf-8')
data = response.text
for word in wordlist:
print('[check_buzzwords] check word:', word)
substrings = find_all_substrings(data, word)
print('[check_buzzwords] substrings:', substrings)
for pos in substrings:
#self.words_found += 1
# only display
print('[check_buzzwords] word: {} | pos: {} | sub: {} | url: {}'.format(word, pos, data[pos-20:pos+20], response.url))
# send to file
yield {'word': word, 'pos': pos, 'sub': data[pos-20:pos+20], 'url': response.url}
# --- run without project and save in `output.csv` ---
from scrapy.crawler import CrawlerProcess
c = CrawlerProcess({
'USER_AGENT': 'Mozilla/5.0',
# save in file CSV, JSON or XML
'FEEDS': {'output.csv': {'format': 'csv'}}, # new in 2.1
})
c.crawl(WebsiteSpider)
c.start()
data[pos-20:pos+20]
生成数据以查看子字符串在哪里,有时它在 URL 中,如
.../elements/adw_2018/catalog/...
或其他地方,如
<img alt=""catalog""
- 所以使用
regex
不一定是好主意。也许更好的是使用
xpath
或
css selector
仅在某些地方或链接中搜索文本。
response.xpath
搜索所有 linsk,然后检查
href
中是否有单词- 所以它不需要
regex
.
-downloads-
的链接(与
s
)作为与词
download
的链接和
downloads
所以它需要更复杂的方法来检查(即使用
regex
)仅将其视为与单词
downloads
的链接
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
wordlist = [
"katalog",
"catalog",
"downloads",
"download",
]
class WebsiteSpider(CrawlSpider):
name = "webcrawler"
allowed_domains = ["www.reichelt.com"]
start_urls = ["https://www.reichelt.com/"]
rules = [Rule(LinkExtractor(), follow=True, callback="check_buzzwords")]
def check_buzzwords(self, response):
print('[check_buzzwords] url:', response.url)
links = response.xpath('//a[@href]')
for word in wordlist:
for link in links:
url = link.attrib.get('href')
if word in url:
print('[check_buzzwords] word: {} | url: {} | page: {}'.format(word, url, response.url))
# send to file
yield {'word': word, 'url': url, 'page': response.url}
# --- run without project and save in `output.csv` ---
from scrapy.crawler import CrawlerProcess
c = CrawlerProcess({
'USER_AGENT': 'Mozilla/5.0',
# save in file CSV, JSON or XML
'FEEDS': {'output.csv': {'format': 'csv'}}, # new in 2.1
})
c.crawl(WebsiteSpider)
c.start()
关于python - 在网站上找到一个词并获取其页面链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68193300/
我在字符串中有一个大词。例子白 Wine 额外优惠。 我想在第一行使用“White”,在第二行使用“wine extra offer”。使用下面的代码: string value="White win
我想在无符号中执行一些算术运算,需要取负整数的绝对值,比如 do_some_arithmetic_in_unsigned_mode(int some_signed_value) { unsign
我正在努力使用 data.table 来总结向量函数的结果,这在 ddply 中很容易。 问题 1:使用带有矢量输出的(昂贵的)函数聚合 dt dt[ , as.list(quantile(x)),
我有两个分数列表; 说 A = [ 1/212, 5/212, 3/212, ... ] 和 B = [ 4/143, 7/143, 2/143, ... ] . 如果我们定义 A' = a[0] *
我已经使用 numpy 从 csv 文件中获取数据。 numpy 数组的尺寸为:100*20。我如何取列的平均值(比如 col 3,5,8)并用包含这 3 个 cols 平均值的新列替换它们 如果
在 Rust 中取任意数的 n 次根的最佳方法是什么?例如,num crate 只允许取整数类型的第 n 个主根,即 floor'ed 或 ceil'ed 值......如何最好地接近实际值? 最佳答
看起来这应该很容易,但我很困惑。我已经掌握了使用 dplyr 进行编程的大致技巧0.7,但为此苦苦挣扎:How do Iprogram in dplyr我想要编程的变量是否是一个字符串? 我正在抓取数
在 Rust 中取任意数的 n 次根的最佳方法是什么?例如,num crate 只允许取整数类型的第 n 个主根,即 floor'ed 或 ceil'ed 值......如何最好地接近实际值? 最佳答
我有一个 pandas 数据框,其中有一列名为“coverage”。对于一系列特定索引值,我想获取前 100 行的平均“覆盖率”值。例如,对于索引位置 1001,我想要第 901-1000 行的平均“
import pandas as pd data = {'date': ['1998-03-01', '2001-04-01','1998-06-01','2001-08-01','2001-05-0
我有一个包含 100 个数字的 NSArray。我想创建一个 5 个数字的 NSArray。第二个数组中的第一个数字是第一个数组中前 20 个数字的平均值。第二个数字是第一个数组中第二组 20 个数字
我该怎么做?我试过 abs() 但它只适用于整数。有内置的方法吗? CGFloat flo = -123; abs(flo) 返回 0 最佳答案 使用 fabs() CGFloat f = -123.
我正在采用以下计算的 log2: tl_out.a.bits.size := log2Ceil(s1_row * s2_column * 4.U) 其中,s1_row 和 s2_column 是 UI
如何从 m 个元素集合中取出 n 个元素,以便在元素用完时从头开始? List list = new List() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; List newL
我已经完成了研究,但似乎找不到有关该主题的足够文档。 在 Object streams 上尝试一些代码时,我注意到将 BufferedOutputStream 放入 ObjectOutputStrea
我需要计算数据中连续时间组之间的差异,如下所示 from io import StringIO import pandas as pd strio = StringIO("""\
我在 Mongo 数据库中有以下文档: { _id: 1, question: "Blue or red?", __v: 0, votes: [9, 5] } 我想在后
好吧,宇宙中一定有人知道这个问题的答案。 我已经在这里问过这个问题,但仍然没有解决方案。 我需要保留和换行 div 中的文本。到目前为止,我很难想出解决方案。我找到的最佳解决方案并不适用于所有浏览器。
我正在尝试采用 3 个单独的整数输入(年、月、日)并采用这 3 个条目并从中形成一个日期对象,以便我可以使用它来比较其他日期。 这是我目前所拥有的,不知从何而来: public void compar
在我的 IOS 项目中,我有一个包含该函数的自定义 Logger 类(单例) - (void)log:(NSString *)domain logLevel:(int)level logMessage
我是一名优秀的程序员,十分优秀!