如何不两次抓取相同的网址?

Posted

技术标签:

【中文标题】如何不两次抓取相同的网址?【英文标题】:How to not scrape the same url twice? 【发布时间】:2019-02-20 21:28:07 【问题描述】:

我的总体目标是拥有一个在网站 url 期间不会被抓取的 url 的数组/列表,如下面的代码示例中所示的逻辑是

('scrapy.py') 的逻辑:

在 ('source') 中打开 url ~> 从 ('source') 中的 url 中找到 'a' 标签 ~> 在 'a' 标签中找到 'href' ~> 如果 'href' 的值不等于( !=) ('done') 在文件 ('doneurls.py') ~> 然后将不等于 ('done') 的 url 写入文件 ('url.py')

我使用的代码是'scrapy.py':

from bs4 import BeautifulSoup
import requests
import csv
import os
import sys
from os.path import dirname, join, abspath
sys.path.insert(0, abspath(join(dirname(__file__), '..')))
from doneurls import done


source = requests.get('http://localhost/index.php').text


soup = BeautifulSoup(source, 'lxml')
file = open('./url.py', 'a')
csv_writer = csv.writer(file)

 from html.parser import HTMLParser

 class MyHTMLParser(HTMLParser):

    def handle_starttag(self,tag,attrs):
        # Only parse the 'anchor' tag.
        if tag == "a":
           # Check the list of defined attributes.
             for name, value in attrs:
           # If href is defined, print it.
           if name == "href":
            if value != done:
                csv_writer.writerow('b="'+value+'"')



parser = MyHTMLParser()
parser.feed(source)
file.close()

index.php:

<a href="http://localhost/next.php">hello</a>
<a href="http://localhost/next3.php">hello</a>
<a href="http://localhost/next2.php">hello</a>
<a href="http://localhost/next1.php">hello</a>
<a href="http://localhost/1.php">hello</a>
<a href="http://localhost/2.php">hello</a>
<a href="http://localhost/3.php">hello</a>

doneurls.py:

done = "http://localhost/2.php"

这段代码似乎有效,它只忽略了我添加到 doneurls.py 的一个 url 并且运行良好,但我想要做的是添加一组 url 来完成这样的操作

done = 
"http://localhost/2.php",
"http://localhost/next1.php",
"http://localhost/next2.php"

当我尝试将“完成”作为数组运行时,根本不会跳过任何网址。我正在使用此代码来尝试不必抓取我过去抓取的网址。

【问题讨论】:

请描述您的问题,而不是代码并格式化您的代码。 问题正在修改中。也许新信息会提供更多的说明。 【参考方案1】:

如果我很好地理解了这个问题,您将尝试查看找到的每个 URL 是否已经完成,使用:

if value != done:

除了问题是上面只允许检查一个done url,而不是可能已经完成的多个url。所以,如果done 变成一个列表,你可以使用运算符in(这里你需要not in,因为我们想检查它是否不存在):

if value not in done:

附带说明一下,Python 中的列表是使用方括号创建的,因此,done 应该类似于以下内容:

done = [
    "http://localhost/2.php",
    "http://localhost/next1.php",
    "http://localhost/next2.php"
]

大括号用于sets 和dictionaries,尽管在这里将done 设置为一组并不重要。

【讨论】:

以上是关于如何不两次抓取相同的网址?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止在node.js中两次调用相同URL的获取

如何查看是不是两次单击相同的元素? jQuery

如何在不包含相同元素两次的情况下遍历列表?

如何从列表中删除两次包含相同数字的组合,其中重复包含相同的数字?

django如何两次渲染相同的模板[重复]

如何避免节点需要加载相同的模块两次