Wenn Sie eine Google-Suche durchführen und einer der Titel "og: description" "h1" ~ "h4" auf der Treffer-Seite ein bestimmtes Schlüsselwort enthält, werden Titel und URL der Zielseite in Textdateien unterteilt. Ausgabe an. Wenn sich die URL bereits in der Textdatei befindet, überspringen Sie die Verarbeitung.
3.8.2
Nach dem Aufbau einer virtuellen Umgebung mit venv etc.
pip install -r requirements.txt
python main.py
requirements.txt
beautifulsoup4 == 4.9.1
requests == 2.24.0
settings.py
settings = {
#Für die Google-Suche verwendete Schlüsselwörter
'google_search_keywords': ['Medizinisch', 'Corona'],
#Anzahl der Suchvorgänge
'google_search_num': 10,
#Schlüsselwörter, die auf der Treffer-Seite gesucht werden sollen
'search_keywords_in_page': ['Medizinisch']
}
main.py
import urllib.parse
import re
import requests
import bs4
from settings import settings
from output import OutputText
def get_ogdesc_from_soup(soup: bs4.BeautifulSoup) -> str:
"""
Aus einer BeautifulSoup-Instanz
<meta property="og:description" content="...">
Und gibt den Inhalt des Inhalts zurück.
Wenn nicht gefunden, wird ein leeres Zeichen zurückgegeben.
"""
og_desc = soup.find('meta', attrs={'property': 'og:description', 'content': True})
if og_desc:
return og_desc['content']
return ''
def get_href_from_soup(soup: bs4.BeautifulSoup):
href = soup.get('href')
href = re.search('(http)(.+)(&sa)', href).group()[0:-3] #Unnötiges Entfernen der Zeichenfolge
href = urllib.parse.unquote(href) #Dekodieren
return href
def do_google_search(keywords: [str], search_num: int) -> [str]:
"""
Führen Sie eine Google-Suche mit Schlüsselwörtern durch
Gibt eine Liste der Treffer-URLs zurück
"""
#Führen Sie die Google-Suche durch
url = 'https://www.google.co.jp/search'
params = {
'hl': 'ja',
'num': search_num,
'q': ' '.join(keywords)
}
response = requests.get(url, params=params)
#Gibt eine Liste der Treffer-URLs zurück
# `.kCrYT`Möglicherweise muss dies aufgrund von Änderungen in den Google-Spezifikationen behoben werden
soup = bs4.BeautifulSoup(response.content, 'html.parser')
soups = soup.select('.kCrYT > a')
return [get_href_from_soup(soup) for soup in soups]
def main():
output_text = OutputText('output.txt')
urls = do_google_search(settings['google_search_keywords'], settings['google_search_num'])
for url in urls:
#Überspringen Sie die Verarbeitung, wenn die Textdatei bereits die URL enthält
if url in output_text.get_urls():
continue
try:
response = requests.get(url)
response.encoding = 'utf-8'
response.raise_for_status()
except:
#Überspringen Sie die Verarbeitung, wenn ein Verbindungsfehler auftritt
continue
soup = bs4.BeautifulSoup(response.content, 'html.parser')
titles = [a.text for a in soup.select('title')]
desc = get_ogdesc_from_soup(soup)
h1s = [a.text for a in soup.select('h1')]
h2s = [a.text for a in soup.select('h2')]
h3s = [a.text for a in soup.select('h3')]
h4s = [a.text for a in soup.select('h4')]
#Überspringen Sie die Verarbeitung, wenn die Seite keine Schlüsselwörter enthält
no_keyword = True
for keyword in settings['search_keywords_in_page']:
for text in titles + [desc] + h1s + h2s + h3s + h4s:
if keyword in text:
no_keyword = False
if no_keyword:
continue
#In Textdatei schreiben
title = '**No title**' if len(titles) <= 0 else titles[0].strip().replace('\n', '')
output_text.write(title, url)
#Textdatei in einfach zu lesendem Format ausgeben
output_text.output_readable_file()
if __name__ == '__main__':
main()
output.py
import myutil as u
import os
class OutputText:
file_path = None
def __init__(self, file_path):
self.file_path = file_path
if not os.path.isfile(file_path):
file = open(self.file_path, 'w', encoding='utf-8')
file.close()
def write(self, title, url):
with open(self.file_path, mode='a', encoding='utf-8') as f:
u.write_with_tab(f, title, url)
f.write('\n')
def get_urls(self):
lines = self.get_lines()
return [self.get_url(line) for line in lines]
def output_readable_file(self):
file = self.file_path.replace('.txt', '_readable.txt')
with open(file, mode='w', encoding='utf-8') as f:
lines = self.get_lines()
for line in lines:
f.write(self.get_title(line) + '\n' + self.get_url(line) + '\n')
f.write('\n------------------------------\n\n')
def get_lines(self):
with open(self.file_path, mode='r', encoding='utf-8') as f:
text = f.read()
lines = text.strip().split('\n')
return lines
def get_title(self, line):
texts_in_line = line.split('\t')
return texts_in_line[0] if len(texts_in_line) >= 1 else ''
def get_url(self, line):
texts_in_line = line.split('\t')
return texts_in_line[1] if len(texts_in_line) >= 2 else ''
myutil.py
def write_with_tab(file, *strings):
"""
Schreiben Sie eine durch Tabulatoren getrennte Zeichenfolge in die Datei
"""
for i, string in enumerate(strings):
file.write(string)
if i != len(strings) - 1: #Wenn nicht die letzte Schleife
file.write('\t')
return file