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

时间:2018-09-17 00:44:00

标签: python beautifulsoup xampp python-requests export-to-csv

我的总体目标是拥有一个不会在网站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"}

当我尝试将'done'作为数组运行时,根本不会跳过任何url。我正在使用此代码来尝试不必刮擦过去刮过的网址。

1 个答案:

答案 0 :(得分:1)

如果我对问题的理解很好,您可以尝试使用以下方法查看找到的每个URL:

if value != done:

问题在于,以上内容仅允许检查一个done网址,而不是可能已经检查过的多个网址。因此,如果done成为列表,则可以使用运算符in(这里将需要not in,因为我们要检查它是否不存在):

if value not in done:

请注意,Python中的列表是使用方括号创建的,因此done应该类似于以下内容:

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

括号用于setdictionaries,尽管在此处设置done并没有太大关系。