-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWebScrapeTools.py
More file actions
64 lines (52 loc) · 1.58 KB
/
WebScrapeTools.py
File metadata and controls
64 lines (52 loc) · 1.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Basic functions to scrape websites.
This file contains basic webscraping elements found in
https://realpython.com/python-web-scraping-practical-introduction/
"""
from requests import get
from requests.exceptions import RequestException
from contextlib import closing
from bs4 import BeautifulSoup
from loguru import logger
@logger.catch
def simple_get(url):
"""
Attempts to get the content at `url` by making an HTTP GET request.
If the content-type of response is some kind of HTML/XML, return the
text content, otherwise return None.
"""
try:
with closing(get(url, stream=True)) as resp:
if is_good_response(resp):
return resp.content
else:
return None
except RequestException as e:
log_error("Error during requests to {0} : {1}".format(url, str(e)))
return None
@logger.catch
def is_good_response(resp):
"""
Returns True if the response seems to be HTML, False otherwise.
"""
content_type = resp.headers["Content-Type"].lower()
return (
resp.status_code == 200
and content_type is not None
and content_type.find("html") > -1
)
@logger.catch
def log_error(txt):
"""
It is always a good idea to log errors.
This function just prints them, but you can
make it do anything.
"""
logger.error(txt)
@logger.catch
def retrieve_cleaned_html(url):
raw_resp = simple_get(url)
if raw_resp is not None:
return BeautifulSoup(raw_resp, "html.parser")
return None