python - 扫描 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.csv:
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
...
解决方案
您可以使用类似的方法异步执行函数asyncio
并等待结果。在您的函数中使用beautifulsoup来查找您的文本或其他内容。然后将结果写入 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)
推荐阅读
- json - 在 PostMan 中模拟特定的 CURL。有问题
- javascript - How to load a component from a button click in react?
- linux - Linux:当有多个逻辑卷时,文件究竟保存在哪里?
- java - 来自 Lambda 表达式的有效 void 返回语句(示例:可运行)
- bazel - 如何指定 bazel cc_binary 规则生成的预期文件扩展名?
- spring-boot - 春季启动升级后获取 java.lang.NosuchFieldError:BINARY
- azure-devops - 如何更改 Azure DevOps 环境代理文件夹结构
- linux - 在 unix 中使用 SFTP 获取文件大小和名称的干净列表
- javascript - shopify 嵌入式应用会话令牌使用烧瓶进行身份验证
- javascript - 如何使用 javascript 编辑 svg 属性?