第一种:

根据规律手工构造各个期刊的url

爬取两遍,第一遍爬完,去重(集合),并初始化结果集;第二遍爬取,在结果集里查询并计数

将结果集转化为列表,并按照列表中times关键字对字典(相当于数据集合)整体排序

写入结果到txt文件

from bs4 import BeautifulSoup as Be
import requests as req
import osBaseUrl = "http://www.52duzhe.com/"def Do_soup(url):try:r = req.get(url,headers={'user-agent':'Mozilla/5.0'})r.raise_for_status()r.encoding = r.apparent_encodinghtml = r.textsoup = Be(html,'lxml')return soupexcept:print("获取"+url+"失败")def Search_each_Per(tag):aut_set = set()a_list = []for i in range(2010,2018):for j in range(1,25):if j<10:ExtraUrl = str(i)+'_0'+str(j)else:ExtraUrl = str(i)+'_'+str(j)if i in [2010,2011,2012]:if(i == 2012 and j>=14):url = BaseUrl + ExtraUrl + r"/index.html"else:url = BaseUrl + '1_' + ExtraUrl + ".html"else:url = BaseUrl + ExtraUrl + r"/index.html"soup = Do_soup(url)  #使用函数if soup == None:continueper_aut_list = soup.find_all('td',class_="author")if tag==1:for k in per_aut_list:aut_set.add(k.string)print("{}年{}期作者已入库".format(i,j))else:for k in per_aut_list:a_list.append(k.string)if tag==1:return list(aut_set)    #返回了一个去重后的作者列表else:return a_list          #返回了一个有重复元素的列表,用于计数def main():author_list0 = Search_each_Per(1)   # 1代表一个控制标记,接收无重列表print("正在接收有重复数据列表,请等待...")a_list = Search_each_Per(0)         #接收有重复元素列表result = {}                         #放结果的字典for i in author_list0:result[str(i)] = 0     #初始化统计结果for j in a_list:if i==j:result[str(i)] += 1#下面对结果按发表次数做降序处理print("下面对结果按发表次数做降序处理...")att = []              #做一个容器for key,value in result.items():j={}j["author"]=keyj["times"]=valueatt.append(j)att.sort(key = lambda x:x["times"],reverse = True)# 将结果写入text文本中print("将结果写入text文本中,请耐心等待...")path = os.getcwd()filename = path + "读者作者结果1.txt"new = open(filename,"w",errors='ignore')   #网络字节流中可能有不合法字符要忽略:illegal multibyte sequencefor i in att:author = i["author"]times = i["times"]print(author)print(times)if author == None:                       #unsupported operand type(s) for +: 'NoneType' and 'str'new.write("None" +"\t" + str(times) + "\n")else:new.write(author +"\t" + str(times) + "\n")new.close()print("完成统计")main()

第二种:

根据规律手工构造各个期刊的url

爬取一遍,用列表(容器)放集合(数据集),并设置tag标签,判断列表中是否有此作者,没有就增加,有就 times+1

直接返回列表,并按照列表中times关键字对字典(相当于数据集合)整体排序

写入结果到txt文件

from bs4 import BeautifulSoup as Be
import requests as req
import osBaseUrl = "http://www.52duzhe.com/"def Do_soup(url):try:r = req.get(url,headers={'user-agent':'Mozilla/5.0'})r.raise_for_status()r.encoding = r.apparent_encodinghtml = r.textsoup = Be(html,'lxml')return soupexcept:print("获取"+url+"失败")def Search_each_Per():obj_list = []for i in range(2010,2018):for j in range(1,25):if j<10:ExtraUrl = str(i)+'_0'+str(j)else:ExtraUrl = str(i)+'_'+str(j)if i in [2010,2011,2012]:if(i == 2012 and j>=14):url = BaseUrl + ExtraUrl + r"/index.html"else:url = BaseUrl + '1_' + ExtraUrl + ".html"else:url = BaseUrl + ExtraUrl + r"/index.html"soup = Do_soup(url)  #使用函数if soup == None:continueper_aut_list = soup.find_all('td',class_="author")for it in per_aut_list:               #别习惯性用i,换个名字,是个坑tag = 0for jk in obj_list:if(jk["author"] == it.string):jk["times"] += 1tag = 1breakif(tag == 0):obj = {"author":it.string,"times":1}obj_list.append(obj)return obj_listdef main():print("正在创建结果对象列表,请耐心等待...")obj_list = Search_each_Per()          #接受结果列表#下面对结果按发表次数做降序处理print("下面对结果按发表次数做降序处理...")obj_list.sort(key = lambda x:x["times"],reverse = True)# 将结果写入text文本中print("将结果写入text文本中,请耐心等待...")path = os.getcwd()filename = path + "读者作者结果3.txt"new = open(filename,"w",errors='ignore')  #网络字节流中可能有不合法字符要忽略:illegal multibyte sequencefor i in obj_list:author = i["author"]times = i["times"]print(author)print(times)if author == None:                       #unsupported operand type(s) for +: 'NoneType' and 'str'new.write("None" +"\t" + str(times) + "\n")else:new.write(author +"\t" + str(times) + "\n")new.close()print("完成统计")main()

第三种:

使用类创建对象(数据集)

直接在主页爬取各期刊链接,放在列表里,遍历列表查询各期刊作者

爬取一遍,用列表(容器)放对象(数据集),并设置tag标签,判断列表中是否有此对象,没有就实例化一个对象并更新列表,有就 对象.times+1

直接返回列表,并按照列表中对象的times属性对对象(相当于数据集合)整体排序

写入结果到txt文件

class Author(object):def __init__(self,name):self.name = nameself.times = 1from bs4 import BeautifulSoup as Be
import requests as req
import osBaseUrl = "http://www.52duzhe.com/"def Do_soup(url):try:r = req.get(url)r.raise_for_status()r.encoding = r.apparent_encodinghtml = r.textsoup = Be(html,'lxml')return soupexcept:print("获取"+url+"失败")def Search_each_Per():url_list = []obj_list = []soup = Do_soup(BaseUrl)link = soup.select(".booklist a")   #获得链接,放回字典for item in link:url = BaseUrl +item["href"]url_list.append(url)for url in url_list:soup = Do_soup(url)  #使用函数if soup == None:continueper_aut_list = soup.find_all('td',class_="author")for i in per_aut_list:tag = 0for j in obj_list:if(j.name == i.string):j.times += 1tag = 1breakif(tag == 0):obj = Author(i.string)obj_list.append(obj)return obj_listdef main():print("正在创建对象列表,请等待...........")obj_list = Search_each_Per()#下面对结果按发表次数做降序处理print("下面对结果按发表次数做降序处理...")obj_list.sort(key = lambda obj:obj.times,reverse = True)# 将结果写入text文本中print("将结果写入text文本中,请耐心等待...")path = os.getcwd()filename = path + "读者作者结果2.txt"new = open(filename,"w",errors="ignore")         #处理非法字符  illegal multibyte sequencefor i in obj_list:author = i.nametimes = i.timesprint(author)print(times)if author == None:new.write("None" +"\t" + str(times) + "\n")else:new.write(author +"\t" + str(times) + "\n")new.close()print("完成统计")main()

欢迎关注微信公众号:编程爱好者联盟

三种方法的结果:(相差不大均可使用)

读者网作者发布次数统计爬虫(三种实现方法)相关推荐

  1. JAVA爬虫三种方法

    文章目录 前言 一.JDK 二.HttpClient 三.Jsoup 总结 前言 记录JAVA爬虫三种方式 一.JDK 使用JDK自带的URLConnection实现网络爬虫. public void ...

  2. python定时爬虫三种方法

    python定时爬虫三种方法 第一种 import timefrom scrapy import cmdlinedef doSth():# 把爬虫程序放在这个类里 zhilian_spider 是爬虫 ...

  3. 颗粒物检测仪常用的三种检测方法

    颗粒物检测仪的测量原理:仪器由组装好的传感器和数据处理器组成.传感器是本装置数据采集的重要部件,原理是将激光束通过非球面镜组变为功率密度均匀分布的细小测量光束,在光束道的侧前方,前方焦点对准光束道,后 ...

  4. 怎样给视频配音?三种配音方法来助力,简单又方便

    怎样给视频配音?三种配音方法来助力,简单又方便 为视频配音是每一位做短视频的作者都应当掌握的一个技能,那么今天我们就来一些学习三种配音方法,各有各的好处,也各有各的不足,不过好在都简单又方便. 方法一 ...

  5. PHP开发之递归算法的三种实现方法

    递归算法对于任何一个编程人员来说,应该都不陌生.因为递归这个概念,无论是在PHP语言还是Java等其他编程语言中,都是大多数算法的灵魂.对于PHP新手来说,递归算法的实现原理可能不容易理解.但是只要你 ...

  6. 黑马程序员_Java解析网络数据流的三种特殊方法

    Java解析网络数据流的三种特殊方法 Java作为最开放的语言,已越来越受到网络程序员的青睐.但这一青睐族有着同样的经历--曾经都为网络上通信的Java数据格式而烦恼. 笔者也不例外,曾经为此而查阅了 ...

  7. php怎么四舍五入,php 四舍五入的三种实现方法

    这篇文章主要为大家详细介绍了php 四舍五入的三种实现方法,具有一定的参考价值,可以用来参考一下. 对php 四舍五入的三种方法感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! php 四 ...

  8. 常用的分隔符有哪三种_三种废水处理方法

    随着城市化进程的发展,工业企业的发展,废水排放量增加,处理废水时,废水处理方法主要有哪三种?康景辉小编和大家一起聊聊三种废水处理方法. 由于工业的快速发展,带来经济上发展的同时也让空气.水资源的质量下 ...

  9. VMware虚拟机的三种联网方法及原理

    VMware虚拟机的三种联网方法及原理 博客分类: 操作系统 虚拟机Vmware互联网网络应用网络协议 一.Brigde--桥接  :默认使用VMnet0 1.原理: Bridge  桥"就 ...

最新文章

  1. python lstm_python-Keras中LSTM的补充
  2. 用python实现链表_用Python实现链表
  3. python 十六进制转中文_Python列表中包含中文时输出十六进制转中文的小方法
  4. 如何在PowerPoint中自动调整图片大小
  5. vmware中centos6.4突然无法进入图形界面解决方法
  6. 东明县计算机学校,东明县职业中等专业学校2021年招生信息
  7. Oracle Hint(提示)与常用方法
  8. CYQ.IISLogViewer 一款IIS 日志分析工具 V1.0 发布[提供源码]
  9. Leetcode每日一题:402.remove-k-digits(移掉k位数字)
  10. java contenttype_SpringMVC Content-Type解析
  11. php 同步文件到服务器上,PHPstorm配置同步服务器文件
  12. C# NamePipe使用小结
  13. HenCoder UI 部分 2-1 布局基础
  14. Untiy相机实现游戏透视效果
  15. 为戴尔服务器下载ESXi
  16. 【C语言】C语言实现strcmp库函数
  17. 把握本质规律——《数学之美》作者吴军接受《程序员》采访
  18. 360 腾讯 迅雷Windows编程 网络编程面试题及答案
  19. 使用LabVIEW进行物体追踪图像处理分析
  20. 设计模式与软件体系结构复习资料——设计模式

热门文章

  1. 查询所有表、索引、视图信息的SQL语句-Mysql/oracle/sql server的不同实现方式
  2. win10 增加eng语言
  3. 分享几个Wordpress模板下载网站
  4. TS 类型备忘 音视频格式
  5. mysql索引怎么设计,MySQL如何设计索引
  6. 计算机专业考研还是不考研?这才是本质区别!
  7. WinXP SP2 USER32.DLL CallWindowProc(...)
  8. 微信查看谁删除了4种方法
  9. html5-canvas(简单贪吃蛇)
  10. 原型图高保真和中保真的区别_具有自适应性能的更高保真度和更平滑的帧频