Python 爬取的类封装【将来可能会改造,持续更新...】(2020年寒假小目标09)
日期:2020.02.09
博客期:148
星期日
按照要求,我来制作 Python 对外爬取类的固定部分的封装,以后在用 Python 做爬取的时候,可以直接使用此类并定义一个新函数来处理CSS选择部分的动态选择。
好了,先说一下设计初衷!我在之前两次的爬取任务中发现我用到的爬取仅仅就是 requests 爬取和 selenium 爬取,而且呢~这两部分的爬取都是按照一定的步骤来做的,第一步,网页加载;第二步,获取 HTML 内容;第三步,使用 CSS 选择器进行筛选;第四步,处理数据打包保存到文件。所以我就先把除了第三步以外的其余部分封装起来了(第三步 CSS 选择部分实在是太灵活了,封装的话要满足灵活性工作量太大,相当于我第一次做的那个连接数据库的Jar包,挺失败的【不过,代码到可以用】)。打包保存文件的部分可以使用 StringWriter (之前也说过了),也可以直接使用 基础 Bean 类的 toFile 方法,这里就直接封装 Bean 类了!
先说目录结构,如下图。分为三个 py 文件,分别对应的是 Bean 、WebDataConnector、WebSelConnector。

Bean 类,这是对之前的基础 Bean 类的封装,内部保存了基础类在爬取过程中的实际用到的各种方法。
WebDataConnector 类,这是 requests 的爬取方法的前两步的封装,具体实现需要自己定义一个方法。
WebSelConnector 类,这是 selenium 的爬取方法的前两步的封装,具体实现需要自己定义一个方法。
【代码仅供参考】
import codecs class Bean:
group = {} def __init__(self):
pass # 重新初始化为实例化阶段
def __reset__(self):
self.group.clear() # 转为字符串类型
def __toString__(self):
num = self.group.__len__()
str_ret = ""
for i in range(0,num):
poi = str(list(dict(self.group).values())[i])
str_ret = str_ret + poi
if i != num - 1:
str_ret = str_ret + "\t"
return str_ret # 转为字符串类型 (带)
def __toStrS__(self,fgf):
num = self.group.__len__()
str_ret = ""
for i in range(0, num):
poi = str(list(dict(self.group).values())[i])
str_ret = str_ret + poi
if i == num - 1:
str_ret = str_ret + str(fgf)
return str_ret # 以追加形式追加到数据文件
def __toFile__(self,filepath):
f = codecs.open(filepath, "a+", 'utf-8')
f.write(self.__toString__() + "\n")
f.close()
Bean.py
from urllib import request import parsel class WebDataConnector:
# 网页地址
web_url = ""
# 固定 header 内容
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'
} # 初始化
def __init__(self,weburl):
self.__reset__(weburl) # 初始化为 最初状态
def __reset__(self,url):
self.web_url = url # 获取网页 HTML 内容
def __getHTML__(self):
req = request.Request(url=self.web_url, headers=self.headers)
r = request.urlopen(req).read().decode()
return r # 获取 CSS选择器的开始工具
def getNercol(self):
index_html = self.__getHTML__()
index_sel = parsel.Selector(index_html)
return index_sel
WebDataConnector.py
import time import parsel
from selenium import webdriver # Selenium 爬取工具
class WebSelConnector:
# 启动器
run_tag = "" # 初始化
def __init__(self):
run_tag = webdriver.Firefox() # 把 页面 切到 url 对应网页
def __pageToURL__(self,url):
self.run_tag.get(str(url)) # 人工设置 线程停滞秒数
def __timeStop__(self,s):
time.sleep(s) # 获取 url 的内部 HTML 代码
def __getHTML__(self):
a = self.run_tag.page_source
return a # 定义释放方法
def __close__(self):
self.run_tag.quit() # 获取 CSS选择器的开始工具
def getNercol(self):
index_html = self.__getHTML__()
index_sel = parsel.Selector(index_html)
return index_sel
WebSelConnector.py
【附加可作为基本类的过去用到的类】(以往博客的网页的代码将会被删除)
import codecs # [ 封装一行文件写入的方法 ]
class StringWriter:
# 文件 路径
filePath = "" # 初始化
def __init__(self, str):
self.filePath = str
pass # 将 文件 清空
def makeFileNull(self):
f = codecs.open(self.filePath, "w+", 'utf-8')
f.write("")
f.close() # 在 文件 后 追加 一行 字符串 数据
def write(self, stri):
f = codecs.open(self.filePath, "a+", 'utf-8')
f.write(stri + "\n")
f.close()
StringWriter.py
# [ 对字符串的特殊处理方法-集合 ] class StrSpecialDealer:
# 取得 当前 标签内的 文本
@staticmethod
def getReaction(stri):
strs = StrSpecialDealer.simpleDeal(str(stri))
strs = strs[strs.find('>')+1:strs.rfind('<')]
return strs # 去除 基本的 分隔符
@staticmethod
def simpleDeal(stri):
strs = str(stri).replace(" ", "")
strs = strs.replace("\t", "")
strs = strs.replace("\r", "")
strs = strs.replace("\n", "")
return strs # 删除 所有 标签 标记
@staticmethod
def deleteRe(stri):
strs = str(stri)
st = strs.find('<')
while(st!=-1):
str_delete = strs[strs.find('<'):strs.find('>')+1]
strs = strs.replace(str_delete,"")
st = strs.find('<') return strs # 删除带有 日期 的句子
@staticmethod
def de_date(stri):
lines = str(stri).split("。")
strs = ""
num = lines.__len__()
for i in range(0,num):
st = str(lines[i])
if (st.__contains__("年") | st.__contains__("月")):
pass
else:
strs += st + "。"
strs = strs.replace("。。", "。")
return strs # 取得带有 日期 的句子之前的句子
@staticmethod
def ut_date(stri):
lines = str(stri).split("。")
strs = ""
num = lines.__len__()
for i in range(0, num):
st = str(lines[i])
if (st.__contains__("年")| st.__contains__("月")):
break
else:
strs += st + "。"
strs = strs.replace("。。","。")
return strs # 去除 文件中 [1] 类型的 标识
@staticmethod
def beat(stri,num):
strs = str(stri)
for i in range(0,num):
strs = strs.replace("["+str(i)+"]","") return strs # 去除 字符串内的指定标签 针对 <></> 型标签 (innerHTML不去除)
@staticmethod
def del_label(stri,label):
s = ""
label = str(label)
strs = str(stri).replace("</"+label+">","")
num = strs.find('<'+label)
while num != -1:
num_s = strs.find('>',num)
str_s = strs[num:num_s+1]
strs = strs.replace(str_s,"")
num = strs.find('<' + label)
return strs
StrSpecialDealer.py
【更新内容】
//------------------------------------------------------------[2020-02-09:更新]
我发现了 Bean 类型需要一个顺序输出器,就是在程序里按照一个列表内元素的顺序输出,我太需要这个了!
下面是在 Bean 类里添加的代码:
# 转为字符串 按照顺序输出
def __toStrSS__(self,link):
link = list(link)
num = link.__len__()
strs = ""
for i in range(0,num):
strs = strs + str(self.group[link[i]])
if i != num - 1:
strs = strs + "\t"
return strs
(Add Into Bean.py)
Python 爬取的类封装【将来可能会改造,持续更新...】(2020年寒假小目标09)的更多相关文章
- Python 爬取 北京市政府首都之窗信件列表-[Scrapy框架](2020年寒假小目标04)
日期:2020.01.22 博客期:130 星期三 [代码说明,如果要使用此页代码,必须在本博客页面评论区给予说明] //博客总体说明 1.准备工作(本期博客) 2.爬取工作 3.数据处理 4.信息展 ...
- Python 爬取 热词并进行分类数据分析-[简单准备] (2020年寒假小目标05)
日期:2020.01.27 博客期:135 星期一 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备](本期博客) b.[云图制作+数据导入] ...
- Python 爬取 热词并进行分类数据分析-[解释修复+热词引用]
日期:2020.02.02 博客期:141 星期日 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入] c.[拓扑 ...
- python爬取某个网页的图片-如百度贴吧
python爬取某个网页的图片-如百度贴吧 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用告诉我 #coding:utf-8 import urllib imp ...
- 使用python爬取MedSci上的期刊信息
使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...
- python爬取免费优质IP归属地查询接口
python爬取免费优质IP归属地查询接口 具体不表,我今天要做的工作就是: 需要将数据库中大量ip查询出起归属地 刚开始感觉好简单啊,毕竟只需要从百度找个免费接口然后来个python脚本跑一晚上就o ...
- python 爬取世纪佳缘,经过js渲染过的网页的爬取
#!/usr/bin/python #-*- coding:utf-8 -*- #爬取世纪佳缘 #这个网站是真的烦,刚开始的时候用scrapy框架写,但是因为刚接触框架,碰到js渲染的页面之后就没办法 ...
- 萌新学习Python爬取B站弹幕+R语言分词demo说明
代码地址如下:http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样 ...
- Python爬取视频指南
摘自:https://www.jianshu.com/p/9ca86becd86d 前言 前两天尔羽说让我爬一下菜鸟窝的教程视频,这次就跟大家来说说Python爬取视频的经验 正文 https://w ...
随机推荐
- splay(1区间翻转区间最值与区间修改)
bzoj1251权限题 题目点这里,你懂得 直接上板子,这个要好好体会 操作是最经典的. #include <algorithm> #include <iostream> #i ...
- configure: error: no acceptable C compiler found in $PATH 解决
在安装keepalived时报错 ./configure --prefix=/usr/local/ccbase/keepalived-2.0.15 && make && ...
- vue中移动端调取本地的复制的文本
_this.$vux.confirm.show({ title: '复制分享链接', content: ‘分享的内容’, onConfi ...
- KM算法模板 hdu 2255
KM算法是在匹配是完备的情况下寻找最优匹配. 首先,先将范围定为最大的情况,如果最大的情况无法满足,就下降一个维度继续匹配. 直到匹配成功. #include<cstdio> #inclu ...
- C9300升级-USB
1.show ver查看设备的版本 2.一些版本信息的参考 3.准备USB查看其具备的镜像命令:dir usbflash0: 4.复制镜像到设备命令:copy usbflash0:cat9k_iosx ...
- 433B.Kuriyama Mirai's Stones
Kuriyama Mirai has killed many monsters and got many (namely n) stones. She numbers the stones from ...
- 共有T个硬币,其中Z个正面,F个反面,分为两堆,要如何操作使得两堆中的正面硬币数目相等。
类似题目如下(数值是可变化的) 你的面前有30个硬币,其中有10个正面朝上,20个反面朝上,混乱在一团. 要求:现在用厚布遮住你的眼睛.要你把30个硬币分成2团,每团正面朝上的硬币个数相等.问:你要怎 ...
- Linux 下使用 ffmpeg 大批量合并 ts 文件, mp4切割文件为m3u8
见范例 ffmpeg -i "concat:file001.ts|file002.ts|file003.ts|file004.ts......n.ts" -acodec copy ...
- 转载:进程退出状态--waitpid status意义
最近遇到一个进程突然退出的问题,由于没有注册signalhandler所以没有捕捉到任何信号. 但是从log中看到init waitpid返回的status为0x008b,以前对status不是很了解 ...
- 题解 P1717 【钓鱼】
P1717 钓鱼 贪心+堆的方法其他题解已经讲的很清楚了,这里放出萌新简洁的dp做法,如果有正确性问题希望大佬能够指出qwq #include<cstdio> using namespac ...