141 lines
7.9 KiB
Python
141 lines
7.9 KiB
Python
|
from .WebHtmlExtractor import WebHtmlExtractor
|
|||
|
import logging
|
|||
|
from .Html2Text import Html2Text
|
|||
|
|
|||
|
|
|||
|
class WebCrawler():
|
|||
|
'''爬取url内容,分为requests和selenium两种方式;selenium需提前下载chrome浏览器与chromedriver,并配置路径。
|
|||
|
安装selenium模拟访问网站,需安装并调试chromedriver,版本与电脑chrome需一致,且正确配置路径。mac电脑路径:打开finder,再按command+shift+G进入/usr/local/bin;windows可配置路径。
|
|||
|
'''
|
|||
|
|
|||
|
def __init__(self):
|
|||
|
pass
|
|||
|
|
|||
|
def webcrawler_single(self,
|
|||
|
html_dir=None,
|
|||
|
text_dir=None,
|
|||
|
base_url=None,
|
|||
|
reptile_lib="requests",
|
|||
|
method="get",
|
|||
|
mode="w",
|
|||
|
time_sleep=4,
|
|||
|
time_out=10,
|
|||
|
target_content_tag={},
|
|||
|
target_tag_list=[]
|
|||
|
):
|
|||
|
'''
|
|||
|
爬取base_url页网址,分别保存html与解析处理的text
|
|||
|
:param html_dir: 保存html地址,jsonl文件
|
|||
|
:param text_dir: 将提取的text内容保存的地址,同样是jsonl格式。
|
|||
|
:param base_url: 目标网址
|
|||
|
:param reptile_lib: requests和selenium两种方式;requests为简单请求静态网址html内容,js动态数据无法获取;selenium为模拟人行为请求,可获取全部html数据,但请求时间较长,尽量设置5s以上的time_sleep,selenium需提前下载chrome浏览器与chromedriver,并配置路径。。
|
|||
|
:param method: requests请求有get/post两种,selenium只支持get
|
|||
|
:param time_sleep: 等待时间s
|
|||
|
:param time_out: 超时时长s
|
|||
|
:param target_content_tag: html中正文content所在tag,字典格式限制长度为1,key为选中便签类型name/class/id,vaule为标签取值如div/title/article等
|
|||
|
:param target_tag_list: 指定提取html对应的tag文本,列表,每个元素都与target_content_tag格式相同
|
|||
|
:return: None
|
|||
|
'''
|
|||
|
assert method=="get","只支持get请求!"
|
|||
|
# 发送请求获取base_url结果:包含相关页面全部网址
|
|||
|
whe = WebHtmlExtractor(time_sleep=time_sleep, time_out=time_out)
|
|||
|
whe.save_url_html(base_url=base_url, reptile_lib=reptile_lib, method=method, html_dir=html_dir, mode=mode)
|
|||
|
# 读取文件
|
|||
|
h2t = Html2Text()
|
|||
|
# 读取并处理,只按照指定tag获取text,不获取全部text内容
|
|||
|
h2t.html2text(target_content_tag=target_content_tag,
|
|||
|
target_tag_list=target_tag_list,
|
|||
|
html_dir=html_dir,
|
|||
|
text_dir=text_dir,
|
|||
|
mode="w",
|
|||
|
is_get_all_text=True)
|
|||
|
|
|||
|
def webcrawler_batch(self,
|
|||
|
html_dir=None,
|
|||
|
text_dir=None,
|
|||
|
target_url_list=[],
|
|||
|
reptile_lib="requests",
|
|||
|
method="get",
|
|||
|
mode="w",
|
|||
|
time_sleep=4,
|
|||
|
time_out=10,
|
|||
|
target_content_tag={},
|
|||
|
target_tag_list=[]
|
|||
|
):
|
|||
|
'''
|
|||
|
爬取base_url页网址,分别保存html与解析处理的text
|
|||
|
:param html_dir: 保存html地址,jsonl文件
|
|||
|
:param text_dir: 将提取的text内容保存的地址,同样是jsonl格式。
|
|||
|
:param base_url: 目标网址
|
|||
|
:param reptile_lib: requests和selenium两种方式;requests为简单请求静态网址html内容,js动态数据无法获取;selenium为模拟人行为请求,可获取全部html数据,但请求时间较长,尽量设置5s以上的time_sleep,selenium需提前下载chrome浏览器与chromedriver,并配置路径。。
|
|||
|
:param method: requests请求有get/post两种,selenium只支持get
|
|||
|
:param time_sleep: 等待时间s
|
|||
|
:param time_out: 超时时长s
|
|||
|
:param target_content_tag: html中正文content所在tag,字典格式限制长度为1,key为选中便签类型name/class/id,vaule为标签取值如div/title/article等
|
|||
|
:param target_tag_list: 指定提取html对应的tag文本,列表,每个元素都与target_content_tag格式相同
|
|||
|
:return: None
|
|||
|
'''
|
|||
|
assert method=="get","只支持get请求!"
|
|||
|
# 发送请求获取base_url结果:包含相关页面全部网址
|
|||
|
whe = WebHtmlExtractor(time_sleep=time_sleep, time_out=time_out)
|
|||
|
# 循环调用
|
|||
|
try:
|
|||
|
for k,url in enumerate(target_url_list):
|
|||
|
mode_batch = mode if k==0 else "a"
|
|||
|
whe.save_url_html(base_url=url, reptile_lib=reptile_lib, method=method, html_dir=html_dir, mode=mode_batch)
|
|||
|
except:
|
|||
|
logging.warning("爬取停止!")
|
|||
|
# html中提取text信息,并对doc做基础处理
|
|||
|
h2t = Html2Text()
|
|||
|
h2t.html2text(target_content_tag=target_content_tag,
|
|||
|
target_tag_list=target_tag_list,
|
|||
|
html_dir=html_dir,
|
|||
|
text_dir=text_dir,
|
|||
|
mode="w",
|
|||
|
is_get_all_text=True)
|
|||
|
|
|||
|
def webcrawler_1_degree(self,
|
|||
|
html_dir=None,
|
|||
|
text_dir=None,
|
|||
|
base_url=None,
|
|||
|
reptile_lib="requests",
|
|||
|
method="get",
|
|||
|
mode="w",
|
|||
|
time_sleep=4,
|
|||
|
time_out=10,
|
|||
|
target_content_tag={},
|
|||
|
target_tag_list=[],
|
|||
|
target_url_prefix=None
|
|||
|
):
|
|||
|
'''
|
|||
|
爬取base_url页面所有<a href=>网址,限制target_url_prefix为前缀,默认target_url_prefix=base_url,分别保存html与解析处理的text。
|
|||
|
:param html_dir: 保存html地址,jsonl文件
|
|||
|
:param text_dir: 将提取的text内容保存的地址,同样是jsonl格式。
|
|||
|
:param base_url: 目标站点
|
|||
|
:param target_url_prefix: 基于base_url网址,1度跳转链接 且 以target_url_prefix开头。默认为target_url_prefix=base_url(请求返回的当前网址url,中文会自动转为编码)。
|
|||
|
:param reptile_lib: requests和selenium两种方式;requests为简单请求静态网址html内容,js动态数据无法获取;selenium为模拟人行为请求,可获取全部html数据,但请求时间较长,尽量设置5s以上的time_sleep。
|
|||
|
:param method: requests请求有get/post两种,selenium只支持get
|
|||
|
:param time_sleep: 等待时间s
|
|||
|
:param time_out: 超时时长s
|
|||
|
:param target_content_tag: html中正文content所在tag,字典格式限制长度为1,key为选中便签类型name/class/id,vaule为标签取值如div/title/article等
|
|||
|
:param target_tag_list: 指定提取html对应的tag文本,列表,每个元素都与target_content_tag格式相同
|
|||
|
:return: None
|
|||
|
'''
|
|||
|
assert method == "get", "只支持get请求!"
|
|||
|
# 发送请求获取base_url结果:包含相关页面全部网址
|
|||
|
whe = WebHtmlExtractor(time_sleep=time_sleep, time_out=time_out)
|
|||
|
try:
|
|||
|
whe.save_1_jump_url_in_base(base_url=base_url, target_url_prefix=target_url_prefix, reptile_lib=reptile_lib,
|
|||
|
method=method, html_dir=html_dir, mode=mode)
|
|||
|
except:
|
|||
|
logging.warning("爬取停止!")
|
|||
|
# 读取文件
|
|||
|
h2t = Html2Text()
|
|||
|
# 读取并处理,只按照指定tag获取text,不获取全部text内容
|
|||
|
h2t.html2text(target_content_tag=target_content_tag,
|
|||
|
target_tag_list=target_tag_list,
|
|||
|
html_dir=html_dir,
|
|||
|
text_dir=text_dir,
|
|||
|
mode="w",
|
|||
|
is_get_all_text=True)
|