操作系统:Windows
Python:3.5
欢迎加入学习交流QQ群:657341423


需要用到的库:
requests
wxPython
docx
win32api需要安装pywin32

解释:
requests这个用来做爬虫,基本上不用多作解释
wxPython和win32api主要生成软件的操作界面,给用户使用。
docx主要将爬取的结果,用word显示出来。


网页分析:
这里以南方日报每天的报纸为例:请点击

可以看到,url后面是一个日期和node为尾的,日期就代表当天的报纸,node是报纸的首页,看到下面红色标记的是每篇新闻的标题,点开标题看到

点开标题后,看到新的url,日期和一个content为尾的。content是代表每篇新闻的详细报道。下面红色标记的是我们需要的正文。
当然,有时候会附带一些图片的,而且是会有多张图片。如:


设计思路:
以http://epaper.southcn.com/nfdaily/html/2017-06/21/node_581.htm 开始。
然后获取这个html里面的带有content的url链接。
再通过获取的url组合成每篇新闻报道的url,然后获取这些url的正文内容,标题和图片。

分析node网页的标题url

可以发现,每个标题都是这样的格式。

再分析content网页的正文和标题,图片。


总的来说,就是在node这个网页,获取每篇新闻详细信息的url,而且这些url带有content的,然后循环访问这些url,获取每篇新闻的标题,正文和图片即可实现。


实现代码:

#爬虫库
from bs4 import BeautifulSoup
import requests
import queue
import re
#读写word
from docx import Document
from docx.shared import Inches
from io import StringIO
#界面设计
import os
import wx
import win32api
import win32con
import win32guidef mkdir(path):#判断是否有文件夹,没则新建path=path.strip()path=path.rstrip("\\")isExists=os.path.exists(path)if not isExists:os.makedirs(path)return Trueelse:return False
PicSavePath=os.getcwd()+"\\news"
mkpath=PicSavePath
mkdir(mkpath)class MyFrame(wx.Frame): def __init__(self, parent, title): super(MyFrame, self).__init__(parent, title = title, size = (500, 350)) self.InitUI()self.Centre() self.Show()      def InitUI(self): panel = wx.Panel(self)hbox = wx.BoxSizer(wx.HORIZONTAL)fgs = wx.FlexGridSizer(4, 2, 10,10)Sort = wx.StaticText(panel, label = "年   份") sale = wx.StaticText(panel, label = "月   份") keys = wx.StaticText(panel, label = "关键字")self.tc1 = wx.ComboBox(panel,value="年份",choices=["2016","2017"]) self.tc2 = wx.ComboBox(panel,value="月份",choices=["1","2","3","4","5","6","7","8","9","10","11","12"]) self.tc3 = wx.TextCtrl(panel, style = wx.TE_MULTILINE)bt1=wx.Button(panel,label = "查询")bt2=wx.Button(panel,label = "清除")fgs.AddMany([(Sort), (self.tc1, 1, wx.EXPAND), (sale),  (self.tc2, 1, wx.EXPAND), (keys, 1, wx.EXPAND), (self.tc3, 1, wx.EXPAND),(bt1),(bt2)])  fgs.AddGrowableRow(2, 1) fgs.AddGrowableCol(1, 1)  hbox.Add(fgs, proportion = 2, flag = wx.ALL|wx.EXPAND, border = 15) panel.SetSizer(hbox) bt1.Bind( wx.EVT_BUTTON, self.query )bt2.Bind( wx.EVT_BUTTON, self.cleanValue )def cleanValue(self,event):self.tc1.ChangeValue('年份')self.tc2.ChangeValue('月份')self.tc3.Clear()def dowloadPic(self,imageUrl,filePath):r = requests.get(imageUrl)with open(filePath, "wb") as code:code.write(r.content)def query(self,event):queryyear=self.tc1.GetValue().strip()KeyValue=self.tc3.GetValue().strip()if KeyValue:Keylist=KeyValue.split('\n')else:Keylist=['南海区专利代理人培训','专利管理师','南海区专利代理行业自律公约','南海区专利特派员','知识产权投融资对接会','科技服务业集聚区','专利质押融资','rttp','南海区荣获中国专利奖','知识产权优势示范企业','知识产权日系列活动','南海基地']if queryyear.isdigit()==False:win32api.MessageBox(0,'请选择年份', '提示',win32con.MB_ICONASTERISK|win32con.MB_OKCANCEL)else:#获取全年的新闻for i in range(12):for k in range(31):#设置日期的月日格式if len(str(i+1))==1:month="0"+str(i+1)else:month=str(i+1)if len(str(k+1))==1:day="0"+str(k+1)else:day=str(k+1)  #生成日期   dateDay=queryyear+"-"+month+'/'+dayprint(dateDay)self.queryDay(dateDay,Keylist)win32api.MessageBox(0,'数据采集完成', '提示',win32con.MB_ICONASTERISK|win32con.MB_OKCANCEL)def queryDay(self,dateDay,Keylist):try:urlList=[]PicUrl=[]#获取每天的报纸里面每篇新闻的urlpapgedate=dateDayurl='http://epaper.southcn.com/nfdaily/html/%s/node_2.htm' %papgedater=requests.get(url)soup=BeautifulSoup(r.content.decode("utf-8"),"html.parser")temp=soup.find_all('div',id='btdh')[0]herfList=temp.find_all('a',href=re.compile("content"))for i in herfList:StarIndex=re.search('href=',str(i)).span()[1]EndIndex=re.search('target',str(i)).span()[0]tempValue=str(i)[StarIndex:EndIndex].replace('"','').strip()if tempValue:urlList.append(tempValue)urlList=sorted(set(urlList))for i in urlList:url='http://epaper.southcn.com/nfdaily/html/%s/%s' %(papgedate,i)r=requests.get(url)#获取每篇新闻的标题和正文soup=BeautifulSoup(r.content.decode('utf-8'),"html.parser")title=soup.find_all('div',id='print_area')[0].find_all('h1')[0].getText()ContentText=soup.find_all('founder-content')[0].getText()PicList=soup.find_all('div',id='print_area')[0].find_all('img',src=re.compile('/res/'))#关键字筛选Mycontent=Falsefor kw in Keylist:if kw in title:Mycontent=Trueelif kw in ContentText:Mycontent=Trueif Mycontent:for j,k in enumerate(PicList):StarIndex=re.search('/res',str(k)).span()[0]EndIndex=re.search('"/>',str(k)).span()[0]tempValue=str(k)[StarIndex:EndIndex].replace('"','').strip()imageUrl='http://epaper.southcn.com/nfdaily'+tempValueself.dowloadPic(imageUrl,i.replace('.','')+"_"+str(j)+".jpg")PicList[j]=i.replace('.','')+"_"+str(j)+".jpg"#写入worddocument = Document()  document.add_heading(title, 0)document.add_paragraph(ContentText)for p in PicList:document.add_picture(p, width=Inches(1.25))os.remove(p)document.save('news//'+title.strip()+'.docx')except Exception as e:passapp = wx.App()
MyFrame(None, title = 'XyJw')
app.MainLoop()  

代码设计思路:
1.代码运行会生成一个用户操作界面,用户可以选择年份和输入关键字对新闻进行筛选,(这里的月份还没做相应的开发。)目前只是做了爬取一年里面的全部新闻,然后将每篇新闻的标题和正文和关键字对比,如果含有关键字的,会爬取下来生成word。如果关键字不输入数据,会默认程序里面的关键字进行筛选。
2.在年份设置那里,我是默认每个月都是31日的,如果当月不存在31日的,在queryDay里面会跳到Exception不作处理。

运行结果:

这里是爬取含义广东为关键字的新闻。


扩展和优化

  1. 在这里,我们会发现,网页的爬取速度很慢。毕竟循环的次数比较多。而且很受网速的影响。
  2. 对于上述代码,可以做优化,最外的循环,是每次生成一个日期,然后再爬取,这里可以用多线程方法,一次爬取2天或者3天的数据,如果是一次2天数据,按一个月32天计算,就是循环16次即可。
  3. 关键字优化,如果要更加精准地获取新闻信息,这里可以自然语言处理方法。
    这里介绍一个现有的方法,就是用百度的现有自然语言处理方法:请点击
    当然也可以自己编写,具体自行百度。

Python requests爬虫实例相关推荐

  1. python多线程爬虫实例-Python多线程爬虫简单示例

    python是支持多线程的,主要是通过thread和threading这两个模块来实现的.thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用. ...

  2. 【Python】爬虫实例——爬取新闻并实现语音播报

    [Python]爬虫实例--爬取新闻并实现语音播报 本文涉及: 1.爬虫请求链接 2.文字转语音(TTS语音合成技术) 安装: pip install pyttsx3 pip install requ ...

  3. Python网络爬虫实例1:股票数据定向爬虫

    Python网络爬虫实例:股票数据定向爬虫 一.功能描述 目标:获取上交所和深交所所有股票的名称和交易信息 输出:保存到文件中 技术路线:requests-bs4-re 二.候选数据网站选择 候选网站 ...

  4. 【Python爬虫9】Python网络爬虫实例实战

    文章目录 2.1自动化登录Facebook 2.3自动化登录Linkedin 爬取Google真实的搜索表单 爬取依赖JavaScript的网站Facebook 爬取典型在线商店Gap 爬取拥有地图接 ...

  5. python多线程爬虫实例-Python爬虫开发【第1篇】【多线程爬虫及案例】

    糗事百科爬虫实例: 需求: 使用requests获取页面信息,用XPath / re 做数据提取 获取每个帖子里的用户头像链接.用户姓名.段子内容.点赞次数和评论次数 保存到 json 文件内 #qi ...

  6. python多线程爬虫实例-Python实现多线程爬虫

    编辑推荐: 本文主要介绍对Python多线程爬虫实战的整体的思路,希望对大家有帮助. 本文来知乎,由火龙果软件Alice编辑,推荐. 最近在写爬虫程序爬取亚马逊上的评论信息,因此也自学了很多爬虫相关的 ...

  7. python爬虫实例教程-Python网络爬虫实例教程(视频讲解版)

    第1章 网络爬虫概述 1 1.1 认识网络爬虫 1 1.1.1 网络爬虫的含义 1 1.1.2 网络爬虫的主要类型 2 1.1.3 简单网络爬虫的架构 3 1.1.4 网络爬虫的应用场景 3 1.2 ...

  8. 网络爬虫python实例视频-Python网络爬虫实例教程 视频讲解版

    章网络爬虫概述1 1.1认识网络爬虫1 1.1.1网络爬虫的含义1 1.1.2网络爬虫的主要类型2 1.1.3简单网络爬虫的架构3 1.1.4网络爬虫的应用场景3 1.2Python网络爬虫技术概况4 ...

  9. python爬虫教程书籍-Python网络爬虫实例教程(视频讲解版)

    第1章 网络爬虫概述 1 1.1 认识网络爬虫 1 1.1.1 网络爬虫的含义 1 1.1.2 网络爬虫的主要类型 2 1.1.3 简单网络爬虫的架构 3 1.1.4 网络爬虫的应用场景 3 1.2 ...

最新文章

  1. 模拟真机环境_QFramework 使用指南 2020(八):Res Kit(2)模拟模式与非模拟模式...
  2. 我的朋友受到社交媒体的算法推荐“蛊惑”,加入了激进组织
  3. SAP WM高阶之上架策略B (Bulk Storage)
  4. 《Pokemon Go》开发商明年将推出「哈利波特」题材AR游戏
  5. LNOI2014 LCA
  6. hdfs数据均衡操作命令
  7. 初中计算机ppt教案,初中计算机ppt教案.doc
  8. HH SaaS电商系统的商品销售分区功能模块设计
  9. 动态网站的技术路线_3个好玩实用小网站!闲暇时间不妨打开看看
  10. idea报Can’t Open Local Terminal
  11. MySQL8.0——Resource Group(资源组)
  12. 学计算机的专属表白方式,九个学科专属表白句子-花式表白公式【蜜匠婚礼】...
  13. 面试宝典系列-mysql面试基础题
  14. 清华大学操作系统OS学习(六)——进程和线程
  15. Python进阶-----类组合的方式完成授权
  16. Linux UIO 驱动模型
  17. ESP32 LVGL8.1 ——Label 标签 (Style 14)
  18. 中科院ICTCLAS分词汉语词性标记集
  19. 小白刷LeeCode(算法篇)
  20. python自动化测试 视频百度云_柠檬班python自动化测试开发课程

热门文章

  1. 有个问题,win10系统,网络诊断,将来会自动连接到jinling,什么意思?
  2. 基于自动驾驶需求的线控转向设计方法
  3. 杰理之测试盒蓝牙无线升级【篇】
  4. JavaScript/jQuery WebIM 及时聊天通信工具 本地客户端
  5. 应用系统运维建设必备的几个方面
  6. springboot+thymeleaf实例
  7. sqli-labs靶场challenges第54-75关(超详细)
  8. osg的geographic和geodetic
  9. 淘系学妹分享阿里的20—60KJava岗位JD,真的太难了
  10. 【JAVA】-JAVA简介