合工大Python爬虫实验——按关键词爬取新闻网站

时隔一年,笔者又拿着实验报告来写篇博客。

实验原理

爬虫实验使用了Python中的requestsbeautifulsoupjsonpandas库,requests用于发送HTTP请求,beautifulsoup用于处理并解析响应的HTML文档,json用于解析json数据,pandas用于数据储存。

1HTTP请求构造

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

HTTP/1.1协议中共定义了八种方法来以不同方式操作指定的资源:

 GET HEAD POST PUT  DELETE TRACE OPTIONS CONNECT

爬虫大多用的就是GET或者POST

2、响应数据处理

对于请求的响应,一般情况下,有html json 两种格式。

HTML数据的解析原理:HTML以尖括号为标记,内部元素分为块元素与行内元素。利用beautifulsoup可以选择目标元素内的文本,爬取并存储即可完成数据解析。

Json数据解析:JSON类似于XML,是一种数据交换格式。JSON JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包。解析后直接分析键值对即可提取目标信息。

实验设计

    从实验原理出发,模拟整个请求响应流程,防止爬虫被网站阻拦。系统流程与结构如下:

爬虫程序流程如下图:

    系统架构如下图:

关键问题及其解决方法

        爬取信息失败,未能获得正常响应

根据分析,修改header以及参数后发现,原因在于header中没有加入Referer这一键值对,导致网站将程序将程序的请求判定为爬虫。

    在一些网站信息的获取过程中,只有在指定的站点发起请求,服务器才会允许返回数据(这样可以防止资源被盗用在其他网站使用)。因此加入Rerferer使得问题解决。

    解决方法:在相关网站打开开发者工具,观察目标数据包的头部,如下:

根据实际情况合理构造头部即可获得正常响应。

        获得正常响应,但获得的数据并不符合关键词

针对这一问题,同样从url,headers以及参数方向考虑,由于urlheaders并不设计到关键词的值,因此考虑参数的值与格式。

    解决方法:

打开工具查看实际参数

构造相同参数进行测试

结果返回失败,于是考虑格式,发现南方新闻网参数的接收格式为application/x-www-form-urlencoded; charset=UTF-8,直接接收表单,不需要将参数json处理再传输,于是直接发送参数,然后即得到正确结果。

设计结果

参数设置:可根据实际需要,设置关键词

爬取结果展示:

南方新闻网:

新浪新闻:

爬虫源码如下:

南方新闻网爬虫源码:

import requests					
from bs4 import BeautifulSoup		
import pandas as pd					
import os
		


def fetchUrl(url, kw, page):
    # 请求头
    headers={
        "accept":"*/*",
        "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
        "origin":"https://search.southcn.com",
        "referer": "https://search.southcn.com/?keyword=chatgpt&s=smart&page={}".format(page),
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.58",
    }
    
    # 请求参数
    payloads = {
        "project_id":5,
        "service_area":1,
        "sort":"smart",
        "position": "",
        "keywords": kw,
        "page_size":10,
        "page": page,
        "type": "normal",
    }

    # 发起 post 请求
    r = requests.post(url, headers=headers, data=payloads)
    return r.json()

def parseJson(jsonObj):
    #解析数据
    records = jsonObj["data"]["news"]["list"]
    for item in records:
        # 解析了"文章id", "标题", "副标题", "发表时间", "编辑", "版面", "摘要", "链接"
        pid = item["id"]
        editor = item["editor"]
        content = item["digest"]
        displayTime = item["pub_time_detail"]
        subtitle = item["sub_title"]
        title = BeautifulSoup(item["title"], "html.parser").text
        url = item["url"]
        
        yield [[pid, title, subtitle, displayTime, editor, content, url]]


def saveFile(path, filename, data):
    # 如果路径不存在,就创建路径
    if not os.path.exists(path):
        os.makedirs(path)
    # 保存数据
    dataframe = pd.DataFrame(data)
    dataframe.to_csv(path + filename + ".csv", encoding='utf_8_sig', mode='a', index=False, sep=',', header=False )


if __name__ == "__main__":
	# 起始页,终止页,关键词设置
    start = 1
    end = 5
    keyword = "chatgpt"
    
    # 保存表头
    headline = [["文章id", "标题", "副标题", "发表时间", "编辑", "摘要", "链接"]]
    saveFile("./data/", "southcn", headline)
    #爬取数据
    for page in range(start, end + 1):
        url = "https://search.southcn.com/api/search/all"
        html = fetchUrl(url, keyword, page)
        for data in parseJson(html):
            saveFile("./data/", "southcn", data)
        print("第{}页爬取完成".format(page))
    

新浪新闻网爬虫:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import os
from lxml import etree


def fetchUrl(url, kw,page):
    # 请求头
    headers = {
        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
        "content-type": "application/x-www-form-urlencoded",
        "origin": "https://search.sina.com.cn",
        "referer": "https://search.sina.com.cn/news",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.58",
    }

    # 请求参数
    payloads = {
        "q":kw,
        "c":"news",
        "range":"all",
        "size":10,
        "page":page
    }

    # 发起 post 请求
    r = requests.post(url, headers=headers, data=payloads)
    return r


def parseHtml(htmlObj):
    html_selector = BeautifulSoup(htmlObj.text,'lxml')
    news = html_selector.find_all("div",attrs = {'class': 'box-result clearfix'})

    # 解析数据
    for item in news:
        # 解析"文章标题", "摘要", “来源与发表时间",  "链接"
        title = item.find("a").text
        content = item.find("p",attrs = {"class":"content"}).text
        origin = item.find("span",attrs = {"class":"fgray_time"}).text
        url = item.find("a")['href']
        yield [[title, content,origin, url]]


def saveFile(path, filename, data):
    # 如果路径不存在,就创建路径
    if not os.path.exists(path):
        os.makedirs(path)
    # 保存数据
    dataframe = pd.DataFrame(data)
    dataframe.to_csv(path + filename + ".csv", encoding='utf_8_sig',
                     mode='a', index=False, sep=',', header=False)


if __name__ == "__main__":
     # 起始页,终止页,关键词设置
    start = 1
    end = 3
    keyword = "chatgpt"

    # 保存表头
    headline = [["文章标题", "摘要", "来源与发表时间", "链接"]]
    saveFile("./data/", "sinanews", headline)
    # 爬取数据
    for page in range(start, end + 1):
        url = "https://search.sina.com.cn/news"
        html = fetchUrl(url, keyword, page)
        for data in parseHtml(html):
            saveFile("./data/", "sinanews", data)
        print("第{}页爬取完成".format(page))


陆仁伽
关注 关注
  • 10
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
教你用python3根据关键词爬取百度百科的内容
12-25
前言 关于python版本,我一开始看很多资料说python2比较好,因为很多库还不支持3,但是使用到现在为止觉得还是pythin3比较好用,因为编码什么的问题,觉得2还是没有3方便。而且在网上找到的2中的一些资料稍微改一下也还是可以用。 好了,开始说爬百度百科的事。 这里设定的需求是爬取北京地区n个景点的全部信息,n个景点的名称是在文件中给出的。没有用到api,只是单纯的爬网页信息。  1、根据关键字获取url 由于只需要爬取信息,而且不涉及交互,可以使用简单的方法而不需要模拟浏览器。 可以直接 <strong>http://baike.baidu.com/search/word?word
针对某关键词爬取相关数据
ayixixixi的博客
12-25 2711
针对某关键词爬取相关数据 目标数据:2020.3.20微博用户发布的包含关键词“疫情”的微博文本数据。 针对上述目标数据,涉及到微博的https://weibo.com和https://weibo.cn站点,其中weibo.com的时间粒度是一个小时,weibo.cn的时间粒度是一天,为了抓取到尽可能多的关键词搜索结果,需要使用weibo.com的高级搜索功能来实现按照关键字和时间进行爬取。考虑到该站点查看数据的最小粒度是一个小时,一个小时内可以查看到的数据是50页,每页最多为20条微博数据,因此每个小时得
python爬取新闻网站内容,python爬取新闻内容报告
最新发布
2301_81900494的博客
03-14 274
这一步我觉得是最重要的,你们要是爬取其他网址,select里面是不一样的,看到class就使用(.),看到id就使用(#)、标签就不需要加什么。在python爬取网页源代码的库主要有urllib、requests,其中requests使用得比较多,另外说明下urllib这个库,在python2中存在urllib2、urllib两个库来爬取网页源代码,但是在python3中将这两个库合并了,就只有urllib这一个库了,但是使用的人相对没有那么多。根据上一步得到的新闻链接来获取这个链接里的新闻内容
Python爬虫实战:根据关键词 爬取潮新闻文章
weixin_58908810的博客
12-31 1171
利用selenium,根据关键词爬取潮新闻相关内容(仅解析html)
合工大数据结构实验 树和森林
04-14
合工大数据结构实验
合工大数据结构实验 查找.zip
04-14
合工大数据结构实验
爬取新闻网站新闻列表的python程序
04-23
本程序可以爬取新闻网站的新闻列表,本代码以中国地质大学(武汉)官网为例,如果需要更换,可以直接更换baseURL,然后打开控制台分析代码结构,适当修改即可。
Python 爬取网站新闻
SlowFeather's blog
05-29 432
Python 爬取网站新闻前言网站截图源码输出文件 前言 仅供学习 网站截图 源码 #引用requests库 import requests #引用pyquery库 from pyquery import PyQuery as pq def WriteTxt(doc): #拿到html里面所有.c_list_bid uls=doc('.c_list_bid') # 拿到所有的li lis = uls.find('li') # 拿到所有的a的物体 tagas
Python爬虫——爬取某网站新闻
热门推荐
奔跑的狮子
06-24 1万+
🙉随机找了个网站爬爬,我们的目标是 1.利用爬虫的re、xpath等知识,爬取到这个官网上的新闻,内容有:新闻标题, 发布时间, 新闻链接, 阅读次数, 新闻来源五个属性。 2.把我们爬到的数据放到一个csv的文件中! 那么我们下面开始!🌝🌎我们的目标是爬取这个https://www.cqwu.edu.cn/channel_23133_0310.html网址的新闻数据 结果 🌗下面是我们程序运行的输出过程 🌖这个是程序把数据存储到csv文件的文档 爬虫的基本步骤: 1.检查有没有反爬,设置常规反...
python爬取网站新闻_爬取网站新闻
weixin_39800971的博客
12-05 197
# -*- coding:utf-8 -*-import jsonimport timeimport requestssession = requests.session()import logging.handlersimport pickleimport sysimport reimport datetimefrom bs4 import BeautifulSoupimport importl...
python3爬取新闻网站的所有新闻-新手起步_python3爬取新闻网站的所有新闻-新手起步...
weixin_42297665的博客
02-20 1279
该篇文章适用于新手,让大家在刚接触爬虫的时候少踩点坑。作者接触python也有几个月时间了,最近要用python做数据采集的工作,因此要用爬虫爬取各大门户网站。好了,废话不多说,直接切入正题。(声明:我整个工作都是在windows下进行的。)1.环境配置。python就够了,关于windows下环境搭建,网上教程很多。这里我附一个。(http://www..com/windinsky/archi...
合工大图形学实验报告
02-05
合工大图形学实验报告 包含实验实验三详细内容 , 以及e-r图 源码 等众多内容
18级合工大数据结构实验单链表
04-14
18级合工大数据结构实验
合工大数据结构顺序表实验
04-14
18级合工大数据结构实验
合工大python实验上机程序代码实验一二
11-11
计算机学院python程序设计实验一二题目答案,个人编写,全部编译通过。基础题目,对于刚入门的小白能够得到锻炼。
根据关键词使用scrapy爬取今日头条网站新闻各类信息和内容
10-10
在今日头条上输入关键词爬取关键词相关的新闻各类信息和内容页。
python3爬虫爬新闻
10-24
pyhton3.6爬取凤凰网新闻,输出txt。后续语料处理,BSBI算法实现索引程序,中文语料处理,择日再传^_^
新闻网站爬虫
03-31
爬虫爬取新闻网站某类集合,源代码
新闻网站网络爬虫
10-28
通过模仿本代码稍加修改就可以从某新闻网站中自动下载文本和视频,类似其他网站也可以
python根据关键字爬取微博
07-15
Python可以利用关键字来爬取微博数据。首先,我们需要使用Python中的requests库或是Scrapy框架来发送HTTP请求,获取微博的网页内容。 其次,通过分析微博的网页结构,找到包含关键字的元素,可以使用BeautifulSoup库或是正则表达式来解析网页内容,提取出关键字相关的微博信息。 在爬取过程中,我们需要模拟登录微博的操作,以获取更多的微博数据。可以使用Python的selenium库来模拟登录,自动点击登录按钮、输入用户名密码等操作。 当获取到包含关键字的微博信息后,可以将其保存到本地文件或是数据库中,方便后续的数据分析和处理。可以使用Python的pandas库来进行数据处理和分析。 另外,为了提高爬取效率,可以采用多线程或是多进程的方式来爬取微博数据。借助Python的线程池或是进程池模块,可以同时发送多个请求,从而加快数据获取的速度。 最后,为了遵守法律法规和尊重网络平台的规定,爬取微博数据时需要注意一些道德和法律方面的问题,如不要过度频繁地请求数据,不要侵犯他人的隐私等。 综上所述,Python可以根据关键字来爬取微博数据,并通过一系列的操作,获取相关信息并进行存储和分析处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 合工大Python爬虫实验——按关键词爬取新闻网站 3307
  • RSA加解密算法的简单实现 2808
  • 信息安全数学基础——求a模p*q的指数 555

最新评论

  • 合工大Python爬虫实验——按关键词爬取新闻网站

    盛一碗阳光: 您好,同请教您爬新闻内容的问题解决了吗

  • 合工大Python爬虫实验——按关键词爬取新闻网站

    煎饼果孒o○: 我看了那个网页,感觉改的没问题,,但就是爬不出内容

  • 合工大Python爬虫实验——按关键词爬取新闻网站

    煎饼果孒o○: 您好,如果想把新闻内容也爬出来需要怎样修改

  • 合工大Python爬虫实验——按关键词爬取新闻网站

    CSDN-Ada助手: 恭喜您写出了这么精彩的博客,非常感谢您分享您的Python爬虫实验经验。您的文章非常有用,帮助了我们更好地理解如何按关键词爬取新闻网站。接下来,我希望您能够继续保持创作热情,分享更多的Python实践经验,不断提升自己的技能水平。期待您的下一篇博客! CSDN 正在通过评论红包奖励优秀博客,请看红包流:https://bbs.csdn.net/?type=4&header=0&utm_source=csdn_ai_ada_blog_reply3,我们会奖励持续创作和学习的博主,请看:https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply3

  • RSA加解密算法的简单实现

    CSDN-Ada助手: 不知道 算法 技能树是否可以帮到你:https://edu.csdn.net/skill/algorithm?utm_source=AI_act_algorithm

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • RSA加解密算法的简单实现
  • 信息安全数学基础——求a模p*q的指数
2023年1篇
2022年2篇

目录

目录

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司民治设计网站哪家好林芝品牌网站设计推荐淮安百度网站优化排名多少钱安康网页设计多少钱成都百度竞价报价武汉网站推广方案推荐抚顺网站优化按天扣费价格包头外贸网站制作报价荷坳企业网站制作报价德阳设计网站公司泸州推广网站价格九江网站制作设计哪家好衡水百姓网标王推广多少钱广元网站seo优化哪家好盐城网站搜索优化公司霍邱网页设计公司大运营销型网站建设多少钱广元网站推广系统价格大运SEO按效果付费哪家好咸阳优化报价永新优化价格太原网站制作设计海南网站改版公司仙桃网站设计模板哪家好包头网站搜索优化哪家好果洛网站优化软件公司鹤壁SEO按天收费多少钱安顺网站关键词优化崇左网站定制价格楚雄英文网站建设哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化