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 ...
随机推荐
- Axure licensee key 8~9-转
转:https://7rp.cn/34 AxureRP v9.0.0.3646 正式版 — 亲测可用 Licensee: jasmine Key: ATocOwMG75ijKpF0OEDSHQ3UZQ ...
- Python(二):做题函数记录
一,10进制 转 2,8,16进制 bin(<int>) ,oct(<int>),hex(<int>) 输出示例 '0b10011010010' '0o2322' ...
- js 判断数组中是否包含某个元素
vuex中结合使用v-if: 链接:https://www.cnblogs.com/hao-1234-1234/p/10980102.html
- 微信小程序--缓存,支持过期时间的二次开发封装
简介 微信小程序提供了缓存的api,包括同步和异步两种,具体api不多说明,可自行查看官方文档 现在微信小程序缓存api存在一个问题就是没有设定过期时间,下面给大家介绍一下对小程序缓存的二次封装,使其 ...
- Mysql实现级联操作(级联更新、级联删除)(转)
一.首先创建两张表stu,sc create table stu( sid int UNSIGNED primary key auto_increment, name varchar(20) not ...
- 【音乐欣赏】《Sunflower》 - Post Malone / Swae Lee
曲名:Sunflower 作者:Post Malone.Swae Lee [00:02.29]Ayy, ayy, ayy, ayy (ooh) [00:09.49]Ooh, ooh, ooh, ohh ...
- vue项目用npm安装sass包遇到的问题及解决办法
IDEA启动vue程序,浏览器访问时出现如下情况的关于node-sass的错误: 错误1: Module build failed (from ./node_modules/sass-loader/d ...
- CSS - div中的文字不换行,超出宽度就用省略号表示
问题 过多的文字会把盒子撑开,造成布局错乱. 解决 .card-title { white-space: nowrap; text-overflow: ellipsis; overflow: hidd ...
- Java 倒入文章显示前n个单词频率
package com_1; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOExc ...
- Redis注册成服务
注册服务 redis-server.exe –-service-install redis.windows.conf 删除服务 redis-server –-service-uninstall 开启服 ...