Сканирование URL-адресов в CSV-файле и добавление столбца ИСТИНА / ЛОЖЬ, если веб-сайты активны / не активны - PullRequest
1 голос
/ 19 марта 2020

Я новичок в python и в настоящее время пытаюсь найти способ просмотреть все URL-адреса в моем CSV-файле, чтобы определить, отображается ли на веб-сайте заданная строка c (в моем случае мне нужно проверить для нескольких строк: «Недоступно», «Скоро в продаже» и «Временно закрыто»).

Структура файла 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
...

Я думаю, что сначала мне понадобится что-то вроде al oop через URL-адреса моего веб-сайта, затем для каждого веб-сайта еще один l oop, чтобы увидеть, ключевые слова, которые я ищу, есть или нет, и, наконец, запишите результаты в мой CSV-файл, где: TRUE, если ключевые слова не были найдены (сайт активен), FALSE, если какие-либо из моих ключевых слов были найдены (сайт не активен). Я не уверен, как подойти к этой проблеме. Я начал с pandas и urlllib.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
...

1 Ответ

2 голосов
/ 19 марта 2020

Вы можете асинхронно выполнять функцию, используя что-то вроде 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 scrap(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([scrap(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)
...