爬虫 只爬取网页部分内容_Python爬虫~已爬取目标网站所有文章,后续如何只获取新文章(实例58)...

news/2024/5/12 22:25:12/文章来源:https://blog.csdn.net/weixin_39636540/article/details/111291082

实例57的爬虫程序已经一次性获取了想要的文章,后续还会不定期的下载新文章,那怎么办呢?不可能每次都运行那个程序,然后重新从头到尾下载一遍吧。那样也忒傻了吧,坚决不干傻事。咱稍稍修改一个“更新爬虫”程序,只需双击,有新文章则自动下载,没新文章则原地不动。理理思路先:

  1. 1. 将上次获取的4946篇文章的链接作为一个数据库存在一个文本文件中

  2. 2. 后续只获取最新的前10页的文章链接,若链接已存在,则跳过

  3. 3. 若链接不存在,则加入数据库,并下载该链接里的文章。

于是乎,开始按这个思路去整理程序。

#将所有历史文章的链接存入文本文件中
import requests
import json

header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'}

form_data = {'_q': 'Article.list',
'siteId': '7e0b3b27-2622-4aa7-b6f8-abfe5c5df922',
'catalogId': '34f92da3-d6d0-4e96-899f-d7f581c18162',
'pub': 'true',
'limit': 10000,
'start': 1}

#这是异步加载,请求方法是POST
url = "http://www.bicpa.org.cn/dtzj/zxgg/getArticles.action"
res = requests.post(url, data = form_data, headers = header)
article_data0 =res.text.split("{success:true,datas:")[1] #去掉字符串前面的无用信息“{success:true,datas:”
article_data = article_data0.split(",total:")[0] #去掉字符串后面的无用信息“,total:4946}”
obj = json.loads(article_data)

#将所有文章链接写入文本文件
path = r"http://www.bicpa.org.cn"
links_file = open('links.txt', 'a') #避免覆盖已有数据,用添加模式`a`写入
for info in obj:
    link = path + info['url'] + info['primaryKey']+".html\n" #只提取链接信息,并换行            
    links_file.write(link) #写入链接信息
links_file.close() #写完后关闭

以上,只是在实例57的“获取所有文章链接”的基础上增加了“将链接写入文本文件”的程序。我们写入的文本文件名是“links.txt”,写入方式为“添加模式”,即程序中的“a”,这样才不会覆盖已有数据。写好的文本文件的内容如下。

60f3c8dbbb595aa8b161d77c728f319c.png

现在,忘记历史,开始新的征程。假设过了一周,查看一下目标网站有无新的文章。判断标准就是看这篇文章的链接是否已存在“links.txt”文件中。如果有新文章,则将新的链接存入数据库“links.txt”中,并判断这篇文章的标题是否含有关键词“委员会专家提示”,若含有则下载到本地;若不含有,则不下载。如果目标网站没有新的文章,则啥也不做。写入文章到word文件的函数Get_article_to_word,直接照抄,随时待命被调用。

#定义函数,获取想要的文章并批量写入word文件
import requests
from bs4 import BeautifulSoup
import docx
from docx.shared import Pt #用于设定字体大小(磅值)
from docx.oxml.ns import qn #用于应用中文字体
import random
import time

def Get_article_to_word(url,date):
    user_agent_list = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
                    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
                    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
                    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
                    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
                    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
                    "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15"
                    ]
    header = {'User-Agent': user_agent_list}
    header['User-Agent'] = random.choice(user_agent_list) #每篇文章随机选择浏览器,避免单个浏览器请求太快被服务器切断连接
    wb_data = requests.get(url,headers = header)
    soup = BeautifulSoup(wb_data.content)
    title = soup.select('.headword')[0].text.strip()#获得标题
    content1 = soup.select(".MsoNormal") #针对正文布局为 class = "MsoNormal"
    content2 = soup.select("#art_content") #针对正文布局为 id = "art_content"

    doc = docx.Document() #新建空白word文档
    #设定全局字体
    doc.styles['Normal'].font.name=u'宋体'
    doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')

    #写入标题行,并设置字体格式
    p = doc.add_paragraph()
    r = p.add_run(title)
    r.bold = True
    r.font.size = Pt(18)

    doc.add_paragraph(date) #写入日期
    doc.add_paragraph(url) #写入文章链接

    #写入正文
    for i in content2:
        doc.add_paragraph(i.text)
    for i in content1:
        doc.add_paragraph(i.text)
    doc.save(f"文章\\{title}.docx")

然后写判断网站是否有新文章更新的程序。获取文章链接的部分基本照抄,只是将form_data里的limit 改成150。因为这个网站更新速度较慢,每次查看是否有更新的时候,只获取前10页共150篇文章的信息就足够了。

最近的150篇文章的链接获取好后,就需要载入数据库中保存的链接,作为判断是否有新文章的基准。使用读取模式("r")打开,并用read()方法读取成一个大字符串,link_database 变量。

然后以添加模式“a”打开数据库文件links,以便有新的链接时进行写入操作。然后新建两个初始值为0的计数器,counter_link和counter_download,分别记录新文章链接个数和新下载的文章个数。

遍历新获取的150篇文章的信息,拼接好链接信息link。然后判断其是否已存在字符串link_database里面,如果已存在,则飘过(pass),直接回到for循环,检查下一篇文章的信息。如果不存在字符串link_database里面,则表示是新发布的文章,需要将其链接加入数据库。然后再进一步判断这篇文章的标题是否含有关键词“委员会专家提示”,如果含有,则下载到本地word文档;若不含有,则不下载。

每增加一条新文章的链接到数据库文件,counter_link增加1。每下载一篇需要的文章,counter_download增加1。最后根据这两个计数器的值,来显示新文章的获取情况。

#判断网站是否有新文章
import requests
import json

header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'}
form_data = {'_q': 'Article.list',
'siteId': '7e0b3b27-2622-4aa7-b6f8-abfe5c5df922',
'catalogId': '34f92da3-d6d0-4e96-899f-d7f581c18162',
'pub': 'true',
'limit': 150, #网站更新速度较慢,每次查看是否有更新的时候,只获取前10页共150篇文章的信息
'start': 1}

#这是异步加载,请求方法是POST
url = "http://www.bicpa.org.cn/dtzj/zxgg/getArticles.action"
res = requests.post(url, data = form_data, headers = header)
article_data0 =res.text.split("{success:true,datas:")[1] #去掉字符串前面的无用信息“{success:true,datas:”
article_data = article_data0.split(",total:")[0] #去掉字符串后面的无用信息“,total:xxxx}”
obj = json.loads(article_data)

#载入数据库中的所有链接,作为判断基准
f = open('links.txt', 'r')
link_database = f.read() #读取成一个大字符串

#将所有新文章链接写入文本文件
path = r"http://www.bicpa.org.cn"
links_file = open('links.txt', 'a') #避免覆盖已有数据,用添加模式`a`写入
counter_link = 0 #新文章链接计数器
counter_download = 0 #新下载文章计数器
for info in obj:
    link = path + info['url'] + info['primaryKey']+".html" #拼接链接信息
    if link in link_database: #判断新提取的链接是否已存在于数据库
        pass
    else:
        links_file.write(link) #写入链接信息
        counter_link +=1 

        #下载标题含有"委员会专家提示"的文章
        if "委员会专家提示" in info['title']:
            Get_article_to_word(link,info["publishDate"]) #调用写好的函数,下载文章到word文件
            counter_download += 1       #每下载一篇文章,计数器增加1

links_file.close() #写完后关闭文件

#显示每次的结果
if counter_link == 0:
    print("没有文章更新!")
else:
    print(f"共获取到 {counter_link} 篇新文章的链接,并加入数据库。")

if counter_download == 0:
    print("没有'委员会专家提示'文章更新!")
else:
    print(f"共下载 {counter_download} 篇'委员会专家提示'新文章,请到文件夹查看。")
>>
没有文章更新!。
没有'委员会专家提示'文章更新!

到此,任务圆满完成c8f0d471392debe73f19235ec7d40e5e.png!但是我们想看看有新文章出现,程序是否能正常运行。好办,将links.txt中最前面的链接数据删除几十条,再运行程序即可。程序运行结果显示:

共获取到 125 篇新文章的链接,并加入数据库。
共下载 3 篇'委员会专家提示'新文章,请到文件夹查看。

Good! 以后想查看有无文章更新,只需要双击一下这个程序就可以了,真个方便得不要不要的805f9319b647dd5c36ffc4f042fc3626.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_716176.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漫谈《大型网站技术架构》

转载请标明出处: http://blog.csdn.net/forezp/article/details/69196483 本文出自方志朋的博客 本文的内容来自阿里巴巴员工李智慧的著作《大型网站技术架构 核心原理与案例分析》,这本书很值得一看,故整理之。 一、大型网站的架构演化 1.1 …

php 验证码不正确,dedecms织梦网站后台登录一直提示验证码不正确

原标题:dedecms织梦网站后台登录一直提示验证码不正确有时候我们在登陆织梦网站后台的时候,我们按照上面显示的验证码进行输入;但是后台一直不能登录成功,一直提示验证码不正确,就是登不进去,但是我明明输入…

html5购物网站前言,HTML5的结构和语义——前言(一)

HTML5的结构和语义——前言(一)2018年03月28日| 萬仟网IT编程| 我要评论超文本标记语言(HTML)5 第一次向HTML 中引入新的元素。新的结构元素包括aside、figure 和section。新的内联元素包括time、meter 和progress超文本标记语言(HTML)5 第一次向HTML 中引入新的元素。新的结构…

网站

------------------------- ------------------ 转载于:https://www.cnblogs.com/Ph-one/p/4734547.html

网站301跳转到新域名

2019独角兽企业重金招聘Python工程师标准>>> 经常有站长提问如何做网站301跳转? 网站301跳转中有一种特殊情况,用户网站更换了域名,但有不想浪费老域名带来的流量,于是就需要做一个跳转,将老网站域名跳转到新新网站域…

lvs+keepalived实现LB热备实现网站高可用

在lvs高负载中,LB节点(也就是常说的DR)会存在单点问题;这里使用了keepalived来解决单点问题;实现冗余; 看图操作; LB1:eth0:192.168.182.133 (vip:eth0:0 192.168.182.2…

大型网站架构之分布式消息队列

以下是消息队列以下的大纲,本文主要介绍消息队列概述,消息队列应用场景和消息中间件示例(电商,日志系统)。 本次分享大纲 消息队列概述消息队列应用场景消息中间件示例JMS消息服务常用消息队列参考(推荐&am…

ASP.NET Core 一步步搭建个人网站(2)_一键部署和用户注册登录

俗话说,磨刀不费砍柴工。为了更方便的进行项目管理,我们先将个人网站项目配置一下,满足以下2个目标: VS2017中支持Git存储库,绑定Github项目,实现本地VS程序与线上Github一键代码提交和同步;搭建…

网站Web项目树形菜单的实现过程(ExtJS+SpringMVC+Spring+Hibernate+MySQL)

常见的OA或者bbs或者网站,左侧往往带有菜单,使用者就可以通过菜单项进入响应的功能模块或者板块或者专区,如下所示:PKU的BBS明显使用了ExtJS的海王星主题,而且使用的就是普通的tabPanel组件实现的菜单。如下图下图是Ex…

Linux配置虚拟网站主机

1.1 问题本例要求以案例1的结果为基础,通过httpd网站服务器实现虚拟主机的支持,完成下列任务: 1)修改 /etc/hosts 文件,临时解决DNS名称识别问题 在文件尾添加“Web服务器IP地址 tts8.tedu.cn ne.tedu.cn”内容2&#…

学python还是php_米凯seo: 到底是学Python、PHP还是Ruby?

编程语言种类繁多,每种语言都有它们的独特的优势。开发者在对编程语言的进行选择时往往很讲究。因此,这篇文章将从各个角度对 PHP、Ruby、Python 三种当前比较流行的语言的优势和劣势进行对比,希望你能从中受益。 在进入主题之前,…

专业团队:推荐一个网站,生成巨幅文字注释

通过学习本文的知识,你将可以在你的项目代码里创造大量的注释。让你的注释闪瞎团队所有人的钛合金X眼,我们是专业团队。 Console.WriteLine(" ██╗ ██╗ █████╗ ██╗ ████████╗███████╗██████╗ ██╗ …

学习python必备的学习网站

Django框架学习必备网站: 官方网站 https://www.djangoproject.com/1.11版英文文档 https://docs.djangoproject.com/en/1.11/1.11版中文文档 https://yiyibooks.cn/xx/Django_1.11.6/index.htmlDjango Book 教程 https://djangobook.com/Flask框架学习必备…

大型系统的java中间件实践_《大型网站系统与JAVA中间件实践》读书笔记-消息中间件...

消息中间件1.消息中间件的价值1.1 透过示例看消息中间件对应用的解耦1.1.1.通过服务调用让其他系统感知事件发生的方式假设我们要做一个用户登录系统,其中需要支持的一个功能是,用户登录成功 后发送一条短信到用户的手机,算是一个用户安全的选…

基于django的视频点播网站开发-step3-注册登录功能...

用户注册登录是一个网站的基本功能,django对这部分进行了很好的封装,我们只需要在django的基础上做些简单的修改就可以达到我们想要的效果。在本讲中,我们会用到user中的用户授权方面的一些函数,还会对django中的user进行扩展&…

vueweb端响应式布局_壹起航:三点看出响应式网站建设好不好

有许多人听说过响应式网站模板(yiqihang.cn),也有人没有听说过响应式网站,有人说响应式网站作用不错,有人说响应式网站没有都去了解过,不好说终究好不好。那么响应式网站建设有哪些优势和缺点呢,如何知道这个响应式网站…

java 开发适合开发什么网站_Java开发这必备的10个参考网站,学习效率直线飙升...

作为开发者来说,必备的除了对编码的热情还要有自己的一套技巧,另外不可缺少的就是平时学习的网站。以下千锋广州Java小编收集的 Java 开发者必备的网站,这些网站可以提供信息、以及一些很棒的讲座 , 还能解答一般问题、面试问题等…

转:Chrome浏览器查看网站登录 Cookie 信息的方法

当我们使用自动签到等程序的时候一般都要用到网站Cookie,我们可以借助浏览器的扩展来获取Cookie信息,但其实通过浏览器本身的功能就可以查看Cookie信息。以Chrome类浏览器为例有以下三种方法。 chrome浏览器: 方法一: 1.打开设…

php seo技巧,十个对排名最有效的SEO​技巧

十个对排名最有效的SEO技巧。做网站排名的人都知道,一个网站能否达到设定的排名值是需要许多的技巧,这些SEO的技巧对于网站的排名来说有着不可替代的作用,在平时的优化当中细细留心,一定会对网站的排名优化有所帮助!第一&#xff…

2017-11-28 在线编程网站对中文代码的支持

参考哪些比较好的在线编程网站?, 测试各个网站对中文命名的代码的支持, 包括调试信息等(见向LeetCode报告编译信息中Unicode显示问题). 有趣的是, 在范围有限的评测中, 国产的在线编程网站似乎对中文命名的代码普遍支持更好. 不知开发者是否对这个功能有特别的关注,…