首页 > 解决方案 > 扫描 CSV 文件中的 URL 并在网站处于活动/非活动状态时添加 TRUE/FALSE 列

问题描述

我是 python 新手,目前正试图找到一种方法来扫描我的 CSV 文件中的所有 URL,以查找网站是否显示了特定的字符串(在我的情况下,我需要检查多个字符串:'Unavailable', “即将推出”和“暂时关闭”)。

CSV 文件结构:

id    website
1    https://www.rainfordsolutions.com/new-online-shop-coming-soon
2    https://www.arrey-fashion.com/a-nice-entry/
3    https://google.com
...

我认为我首先需要通过我的网站 URL 进行某种循环,然后对于每个网站,另一个循环来查看我正在寻找的关键字是否存在,最后将结果写入我的 CSV 文件,其中:TRUE if未找到关键字(网站有效),如果找到我的任何关键字(网站无效),则为 FALSE。我不确定如何解决这个问题。我从 pandas 和 urllib.request 开始,但我知道还有漂亮的汤和请求库。有人可以帮我解决这个问题吗?提前致谢!

import pandas as pd
import urllib.request

df = pd.read_csv('path/to/my/file/with/urls.csv')
for v in df['website']:
with urllib.request.urlopen(v) as url:


df['active'] = 

df.to_csv('path/to/my/output/urls_and_flag.csv', index=False)

所需的输出 urls_and_flag.cs​​v:

id    website                                                           active
1    https://www.rainfordsolutions.com/new-online-shop-coming-soon      FALSE
2    https://www.arrey-fashion.com/a-nice-entry/                        FALSE
3    https://google.com                                                 TRUE
...

标签: pythonpandascsvweb-scrapingbeautifulsoup

解决方案


您可以使用类似的方法异步执行函数asyncio并等待结果。在您的函数中使用来查找您的文本或其他内容。然后将结果写入 csv 文件:

import requests
import pandas as pd
from bs4 import BeautifulSoup
import asyncio
import re

from concurrent.futures import ProcessPoolExecutor, as_completed

df = pd.read_csv('test.csv')

urls = df.T.values.tolist()[1]
results = {}

async def scrape(url):
    try:
        r = requests.get(url)
        soup = BeautifulSoup(r.content, 'html.parser')
        data = {
            "help": soup.body.findAll(text = re.compile("^help$", re.I)),
            "search": soup.body.findAll(text = re.compile("^search$", re.I))
        }
        results[url] = data
    except requests.exceptions.RequestException as e:
        results[url] = { "help": [], "search": []}

async def main():
    await asyncio.wait([scrape(url) for url in urls])

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

helpList= []
searchList = []
for url in urls:
    helpList.append("x" if len(results[url]["help"]) > 0 else "")
    searchList.append("x" if len(results[url]["search"]) > 0 else "")

df["help"] = pd.DataFrame(helpList, columns=['help'])
df["search"] = pd.DataFrame(searchList, columns=['search'])

print(df)

df.to_csv('test.csv', index=False)

推荐阅读