爬虫用的频率较少,每次使用都会手生,特此记录一次实战经历。

项目需求

要求爬取济南市政务网中“滚动预警”菜单中的文章,包括文章标题,文章正文,文章时间,并保存为txt文件。

项目分析

1、判断可爬取的内容

首先查看该网站的robots.txt文件,发现并不存在该文件。因此相关公开信息可正常爬取。

2、确定网页的加载模式

网页加载可分为静态加载和动态加载。
在网页中右键->选择查看源代码,即网页的静态代码。在网页中右键->检查,可查看浏览器当前渲染的内容。
若两者一致,则网页是静态加载。此时,通常使用requests.get的方式即可获取到网页数据。
若两者不一致,网页是动态加载。此时需通过开发者后台查看本地向服务器发送的交互性数据(XHR)。

每隔3页,网页会短暂卡顿,进行加载,同时可以发现多了一份XHR数据,如图所示,此时,请求的网址如上所示,url中标记了起始数据和结束数据,同时,网页的请求方法为POST。

3、查看提交的表单内容


如图所示,提交的表单主要有七个数据,查看该网站的其他页面,可以大概猜测:
webid用于区分不同的大板块,columnid用于区分每个大板块中的小板块,其它属性未知。在翻页过程中,仅有url发生变化,提交的表单内容固定。
还可以发现,应急要闻和滑动预警所请求的url相同,区别是表单数据:应急要闻的columnid为29112,滑动预警的columnid为34053。

4、获取文章标题、内容与发布时间

通过上面的分析,已经可以通过post的方式获取各页目录的源代码,再次基础上,需要通过目录的链接,进入到每篇文章的页面进行,标题、正文、时间的提取。
通过bs4的函数工具以及正则表达式,可将链接内容提取出来,存放到Linklist。
点击链接进行跳转,可以发现正文内容页面使用静态加载,此时使用get或post的方法均可得到文章内容。我在这里仍沿用了之前封装好的post方法。
分别提取文章标题、内容、时间存储至title_list、content_list、time_list。

5、寻找规律自动翻页

通过上面的操作,已经可以获取了一次加载的内容,即三页内容(27条新闻),下面将通过寻找规律进行多次加载。
寻找规律:
1-3页:
http://jnsafety.jinan.gov.cn/module/web/jpage/dataproxy.jsp?startrecord=1&endrecord=27&perpage=9
4-6页:
http://jnsafety.jinan.gov.cn/module/web/jpage/dataproxy.jsp?startrecord=28&endrecord=54&perpage=9
255页(最后一页):
http://jnsafety.jinan.gov.cn/module/web/jpage/dataproxy.jsp?startrecord=1999&endrecord=2025&perpage=9
发现仅是变化了startrecord(开始页面)和endrecord(结束页面)
于是设定开始页面为i=1,结束页面为i+26,每次遍历i+27,直到返回的Linklist为空,跳出循环。

完整代码

import os
from bs4 import BeautifulSoup
import re
import requests# post得到网页并用bs4进行网页解析
def getHtml(url):header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/52.0.2743.116 Safari/537.36'}data = {'col': 1,'webid': '33','path': 'http://jnsafety.jinan.gov.cn/',# 'columnid': '29112',  # 29112对应应急要闻'columnid': '34053',  # 34053对应滚动预警'sourceContentType': '1','unitid': '92715','webname': '%E6%B5%8E%E5%8D%97%E5%B8%82%E5%BA%94%E6%80%A5%E7%AE%A1%E7%90%86%E5%B1%80','permissiontype': 0}rep = requests.post(url=url, data=data, headers=header, stream=True).text# 解析网页soup = BeautifulSoup(rep, 'html.parser')return soup# 从a标签中切分出具体文章链接
def split_link(string):start_string = 'http'end_string = '.html'sub_str = ""start = string.find(start_string)# 只要start不等于-1,说明找到了httpwhile start != -1:# 找结束的位置end = string.find(end_string, start)# 截取字符串 结束位置=结束字符串的开始位置+结束字符串的长度sub_str = string[start:end + len(end_string)]# 找下一个开始的位置# 如果没有下一个开始的位置,结束循环start = string.find(start_string, end)return sub_str# 截取文章发布时间的年月日
def split_time(t):year = t[0:4]month = t[5:7]day = t[8:10]data = "%s-%s-%s" % (year, month, day)return data# 获取一页中的所有链接
def get_link_list(soup):# 使用正则表达式提取链接内容p = re.compile(r'<div class="ajj_clear_box">(.*?)</div>?', re.S)items = re.findall(p, str(soup))# print(items)Linklist = []# 返回出各网站内容链接for item in items:# print(item)link = split_link(item)Linklist.append(link)return Linklist# 获取单篇文章标题、内容与发布时间
def get_title_content(soup_ev):# 文章标题title = soup_ev.find(name="meta", attrs={"name": "ArticleTitle"})['content']# print(title)# 文章内容content = soup_ev.find(name="div", attrs={"id": "zoom"}).findAll(name="span")# 文章发布时间pub_time = soup_ev.find(name="meta", attrs={"name": "pubdate"})['content']p_time = split_time(pub_time)# print(p_time)return title, content, p_time# 保存单篇新闻
def save_content(title, content, index, time):for item in content:text_content = item.text# print(text_content)# 以标题名作为文件名,防止某些标题含有特殊符号,将其替换为空sets = ['/', '\\', ':', '*', '?', '"', '<', '>', '|']for char in title:if char in sets:title = title.replace(char, '')tex_name = "%d%s-%s" % (index, title, time)# 注:由于每段文字是分离的,因此写入文件模式设定为追加写入(a)# 文件夹在主函数内创建with open(r'./应急要闻/%s.txt' % tex_name, mode='a', encoding='utf-8') as f:# 每段文字进行换行f.write(text_content + "\n")''' 滚动预警with open(r'./滚动预警/%s.txt' % tex_name, mode='a', encoding='utf-8') as f:# 每段文字进行换行f.write(text_content + "\n")'''# 获取一次加载的新闻链接列表
def get_news_list(Linklist):title_list = []content_list = []time_list = []for item in Linklist:# item、soup_ev都有可能因返回数据出现异常中断,这里对异常数据不作处理,跳过中断try:soup_ev = getHtml(item)title, content, p_time = get_title_content(soup_ev)title_list.append(title)content_list.append(content)time_list.append(p_time)except Exception:passcontinuereturn title_list, content_list, time_list# 根据文章的时间重新进行排序(按时间从后到前)
def sort_news(title_list, content_list, time_list):title_content_time = zip(title_list, content_list, time_list)sorted_title_content_time = sorted(title_content_time, key=lambda x: x[2], reverse=True)result = zip(*sorted_title_content_time)title_list, content_list, time_list = [list(x) for x in result]return title_list, content_list, time_list# 保存list中所有新闻
def save_all(title_list, content_list, time_list):loop = zip(title_list, content_list, time_list)index = 1for title, content, time in loop:save_content(title, content, index, time)index += 1if __name__ == '__main__':# 在当前目录下创建存储新闻内容的文件夹path = os.getcwd()file_path = path + '\\' + str("滚动预警")# file_path = path + '\\' + str("应急要闻")os.mkdir(file_path)# 存储每三页的标题、内容、时间title_list = []content_list = []time_list = []# 存储所有新闻的标题、内容、时间tol_title_list = []tol_content_list = []tol_time_list = []i = 1while True:url = 'http://jnsafety.jinan.gov.cn/module/web/jpage/dataproxy.jsp?startrecord=%d&endrecord=%d&perpage=9' % (i, i + 26)soup = getHtml(url)Linklist = get_link_list(soup)# 取消下面的注释,可打印出每次请求得到的链接数,以显示程序正在允许中# print(len(Linklist))# print(Linklist)# 假如爬完所有内容,跳出循环if Linklist:title_list, content_list, time_list = get_news_list(Linklist)tol_title_list.extend(title_list)tol_content_list.extend(content_list)tol_time_list.extend(time_list)else:breaki = i + 27# print(len(tol_title_list))# print(len(tol_content_list))# print(len(tol_time_list))tol_title_list, tol_content_list, tol_time_list = sort_news(tol_title_list, tol_content_list, tol_time_list)save_all(tol_title_list, tol_content_list, tol_time_list)

常见报错

1、(‘Connection aborted.’, TimeoutError(10060, ‘由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。’, None, 10060, None))

解决方式:关闭电脑的防火墙。

2、Failed to establish a new connection: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。’))

问题分析:该报错可能是ip被封或者爬虫访问速度过快,服务器来不及响应。
解决方式:每次gethtml添加time.sleep(1),让每次爬取间隔1秒时间,若仍报错,尝试使用代理ip。

【爬虫实践】爬取官方新闻标题、正文、时间相关推荐

  1. Java爬虫,爬取新闻网的标题、时间和图片,并存入MySQL数据库

    实现爬取"淮师新闻网"的新闻列表.新闻详情信息,并将爬取到的信息存入数据库. 可以抓取非HTML信息(HttpClient):例如网页上动态加载的Json信息 可以抓取多媒体信息, ...

  2. python爬虫爬取网页新闻标题-看完保证你会

    python爬虫爬取网页新闻标题方法 1.首先使用浏览自带的工具--检查,查找网页新闻标题对应的元素位置,这里查到的新闻标题是在 h3 标签中 2.然后使用编辑器编写python代码 2.1方法一: ...

  3. 爬虫python 新闻,Python爬虫实例--爬取人民网新闻

    其实我只是因为在那边评论区想评论,然后发现位置不够,所以才打算写这个博客的,然后具体的可以看我转载的文章,很详细,我这边只说一下关于txt转换为JSON格式的问题 第一次写,格式可能很乱,见谅一下 话 ...

  4. 爬虫(爬取36kr新闻)(未完成)

    爬取36kr网站的经历 虽然之前老是听同学提起网络爬虫,但是自己一直没有尝试过.这次因为项目需要,我也开始了爬虫之旅.跌跌撞撞,特此记录,希望能够帮助到一些人,也是对自己的一个总结提高. 设计到的知识 ...

  5. python爬百度新闻_13、web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息...

    crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息, ...

  6. 04-python简单爬虫_爬取网易新闻

    # -*- coding: utf-8 -*- import os import sys import requests import re from lxml import etree"& ...

  7. 金融大数据Python爬虫——(按时间爬取、一次性批量爬取多页、一次性批量爬取多家公司多页)爬取百度新闻标题、网址、日期和新闻来源(数据爬取、清洗)

    好几个月没写博文了,有空来玩玩爬虫,之前接触了一个爬虫的项目,感触挺深的,当时有个爬取巨潮网的操作,网上的代码天花乱坠,最后还是要靠自己,今天这篇算是入门级别,欢迎收藏评论.

  8. python爬取小说项目概述_Python实战项目网络爬虫 之 爬取小说吧小说正文

    本次实战项目适合,有一定Python语法知识的小白学员.本人也是根据一些网上的资料,自己摸索编写的内容.有不明白的童鞋,欢迎提问. 目的:爬取百度小说吧中的原创小说<猎奇师>部分小说内容 ...

  9. 爬取百度新闻标题和链接

    使用python爬取新闻标题及链接,解析数据保存为excel文件. import re import requests from lxml import etree import pandas as ...

最新文章

  1. Tomcat 与 Resin PK大战
  2. 前端小白用面向对象思想实现元素拖拽
  3. 服务器购买是有无系统,买服务器含不含操作系统
  4. 2.9 Logistic 回归的梯度下降法-深度学习-Stanford吴恩达教授
  5. make zImage和make uImage的区别和mkimage工具的使用
  6. STM32 连续操作flash
  7. pythonunicode和str_python2 中 unicode 和 str 之间的转换及与python3 str 的区别
  8. Linux yum源码包安装和卸载
  9. MATLAB 正态分布点云配准(NDT)
  10. Java架构师面试十大连环炮
  11. 格子地图 像素坐标 地图坐标 转化
  12. 简单版捕鱼达人的制做
  13. 对比Excel两个sheet的数据是否相同
  14. localStorage的黑科技-js和css缓存机制
  15. LVGL学习——初识动画 lv_anim_t
  16. 小木虫内蒙古科技大学计算机,2019年内蒙古科技大学招收考研调剂(二)
  17. Linux 安装VMware Tools(open-vm-tools)实现桌面全屏、跨平台复制等功能
  18. 《嫌疑人X的献身》读书笔记
  19. 腾讯云SDK使用python版
  20. [Python]校园网(网页认证)开机/断网自动连接

热门文章

  1. 达梦数据库生成AWR报告
  2. C语言字符输入回车时停止,解决C语言输入单个字符屏蔽回车符的问题
  3. 前端基础--DW的使用
  4. 邻接矩阵对称归一化的作用
  5. 华为智慧屏 鸿蒙如何获得,华为智慧屏鸿蒙UI系统获得2020德国红点设计大奖
  6. CAD恢复被删除的实体
  7. 配置支付目录 - 【微信支付】JSAPI支付开发者文档
  8. Spring事务传播实现原理
  9. html项目的致谢词,毕业设计致谢词大全
  10. 什么是链游?链游是未来游戏的发展趋势吗?