鱼C论坛

 找回密码
 立即注册
查看: 5621|回复: 27

[技术交流] 22 Python新闻爬虫实战

[复制链接]
发表于 2017-6-23 15:22:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 和vvv 于 2017-6-27 09:56 编辑
22 Python新闻爬虫实战

一、新闻爬虫需求及实现思路

需求:将腾讯新闻首页所有新闻都爬到本地

思路:先爬首页,通过正则获取新闻链接。然后依次爬各新闻,并存储到本地。

二、新闻爬虫编写

(1)首先利用urllib库尝试爬取,看是否存在爬取限制。
import urllib.request
import re

url = "http://news.qq.com/"
data = urllib.request.urlopen(url).read().decode('utf-8')
print(len(data))
结果出现了错误:
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-5-884fd8f1ecfe> in <module>()
      3 
      4 url = "http://news.qq.com/"
----> 5 data = urllib.request.urlopen(url).read().decode('utf-8')
      6 print(len(data))

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
显然这是编码的问题,但我们用浏览器打开腾讯新闻首页,查看源代码发现其编码就是utf-8。把它改成GBK之后,有时能成功,但大多数情况下都没有成功。
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-14-1048877e7349> in <module>()
      3 
      4 url = "http://news.qq.com/"
----> 5 data = urllib.request.urlopen(url).read().decode('GBK')
      6 print(len(data))

UnicodeDecodeError: 'gbk' codec can't decode byte 0x8b in position 1: illegal multibyte sequence
这是怎么回事呢?
网上找了一些资料,原来如此。这是因为在网页返回内容的这里是“gzip”。
图片1.png

这条信息代表本地可以接收压缩格式的数据,而服务器在处理时就将大文件压缩再发回客户端,浏览器在接收完成后在本地对这个文件又进行了解压操作。出错的原因是因爬虫程序没有解压这个文件。用urllib库会出现这个问题。


这个问题,终于解决了:
#使用gzip包来进行解压
import urllib.request
import gzip
import chardet

url = 'http://news.qq.com/'
response = gzip.decompress(urllib.request.urlopen(url).read())
print(chardet.detect(response))
结果:
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
访问成功了就可以进行其他的操作了。


在这里,我采用的是另一种方法:使用requests库代替urllib库获取网页内容。
import requests
url = "http://news.qq.com/"
data = requests.get(url).text
print(len(data))
326571
结果没有问题。

(2)分析网页源码,找出新闻链接的规律,写出正则表达式,最后是实现

用搜狗浏览器(其他也行)打开腾讯新闻首页,右键“查看源文件”。随便复制一条新闻的标题,然后再源码中查找。寻找用正则表达式比较好提取的链接:
<a target="_blank" class="linkto" >于欢案二审宣判:原判量刑过重 无期改判5年</a>
或者
            <li><span>5</span><a  target="_blank">于欢案二审宣判:原判量刑过重 无期改判5年</a></li>
然后再搜索‘<a target="_blank" class="linkto"’,可以发现有50多条。搜索‘<li><span>’,只有10多条。显然提取新闻链接正则表达式可以这样提取。
pat = '<div class="text">.*?<a target="_blank" class="linkto" href="(.*?)"'
说明一点,正则表达式尽量从网页标签的外围开始提取。
实践一下:
import requests
import re
url = "http://news.qq.com/"
data = requests.get(url).text
print(len(data))
pat = '<div class="text">.*?<a target="_blank" class="linkto" href="(.*?)"'
#模式修正符让 . 能够匹配换行
allurl = re.compile(pat,re.S).findall(data)
for i in allurl:
    print(i)
显然成功了。
326570
http://news.qq.com/a/20170623/011044.htm
http://digi.tech.qq.com/a/20170623/022898.htm
http://news.qq.com/a/20160418/023091.htm
http://news.qq.com/a/20170623/015424.htm
http://tech.qq.com/a/20170623/020852.htm
http://tech.qq.com/a/20170623/024206.htm
http://stock.qq.com/a/20170623/018153.htm
http://tech.qq.com/a/20170623/009320.htm
http://news.qq.com/a/20170623/020843.htm
http://news.qq.com/a/20170623/020322.htm
http://news.qq.com/a/20170623/008309.htm
http://news.qq.com/a/20170623/015176.htm
http://news.qq.com/a/20170623/004635.htm
http://news.qq.com/a/20170623/001194.htm
http://news.qq.com/a/20170623/001047.htm
http://news.qq.com/a/20170623/002015.htm
http://news.qq.com/a/20170623/001868.htm
http://news.qq.com/a/20170623/001891.htm
http://news.qq.com/a/20170623/001954.htm
http://news.qq.com/a/20170623/001391.htm
http://tech.qq.com/a/20170622/057876.htm
http://news.qq.com/a/20170623/001224.htm
http://news.qq.com/a/20170623/001299.htm
http://news.qq.com/a/20170622/052991.htm
http://news.qq.com/a/20170623/001274.htm
http://news.qq.com/a/20170622/053439.htm
http://news.qq.com/a/20170622/046523.htm
http://finance.qq.com/a/20170622/053428.htm
http://news.qq.com/a/20170622/052374.htm
http://news.qq.com/a/20170622/042882.htm
http://tech.qq.com/a/20170622/043507.htm
http://sports.qq.com/a/20170622/047401.htm
http://sports.qq.com/a/20170622/041502.htm
http://news.qq.com/a/20170622/038445.htm
http://ent.qq.com/a/20170622/020317.htm
http://tech.qq.com/a/20170622/039913.htm
http://news.qq.com/a/20170622/043382.htm
http://news.qq.com/a/20170622/040303.htm
http://edu.qq.com/a/20170622/040148.htm
http://news.qq.com/a/20170622/026520.htm
http://news.qq.com/a/20170622/034117.htm


既然有了新闻链接,我们是不是还应该有新闻名呢。可以这样来:
import requests
import re
url = "http://news.qq.com/"
data = requests.get(url).text
print(len(data))
pat = '<div class="text">.*?<a target="_blank" class="linkto" href=".*?">(.*?)</a>'
#模式修正符让 . 能够匹配换行
allurl = re.compile(pat,re.S).findall(data)
for i in allurl:
    print(i)
326570
于欢案二审宣判:原判量刑过重 无期改判5年
苹果发布官方声明:去年下半年开始已移除10万app
巴西众院弹劾总统案获通过 罗塞夫政党承认落败
美媒:美国男子被控向中国传递绝密文件 或被判死刑
乐视还债表现不佳 仁宝电脑暂停向乐视致新入股7亿元
LinkedIn中国总裁沈博阳离职 曾志恒任代理中国总裁
创6个月新高 !万科A大涨近9% 分析称深铁入主是利好
董明珠谈上手机开机画面:不是因为我美
人社部:养老保险基金在东北出现当期收不抵支
河北发布雄安新区交通规划:将以轨道交通为主
“中国史”不属于历史学专业?女生报考公务员被拒
崔顺实首罪宣判:因涉嫌妨碍业务等罪获刑3年
篮球场暂时关闭,洛阳广场舞大爷大妈占领羽毛球场
深圳一房企被爆欠薪3000万 房企“钱荒”来临?
实地探访“巴铁”投资方 投资者三句不离“兑付”
特朗普建议把美墨边境墙修成太阳能墙:越高价值越大
泰国国王在德国遭两名少年用橡皮子弹射击 未被击中
军队武警部队停止有偿服务如何做补偿?官方回应
日媒:安倍ZF拟修改和平宪法,将自卫队地位明文化
北约战机威胁俄防长座机被驱离 俄官员:下流行为
特斯拉独家回应:正与上海市ZF讨论建厂可能性
深山丛林暗藏制毒窝点 警方在悬崖上开辟抓捕通道
万达复星遭“股债双杀” 是监管进深水区结的果?
俄外交部:IS头目巴格达迪“很可能已经被消灭”
校园贷诈骗案数据:大学生从受骗者变施骗者
文在寅:萨德部署“神秘”加速 已有2架发射台部署
巴拿马总统明确称两岸“外交休兵”已结束 中方回应
遭遇股价狂跌 复星仍忙着在俄罗斯买地产和黄金项目
危地马拉沿岸近海发生6.8级地震 震源深度40千米
杭州豪宅大火母子4人遇难 34岁保姆有重大作案嫌疑
乐视拖欠中移动费用 290G带宽或被下线
国乒意外频出士气低迷 王楠老公曝全队已被禁声
足协重磅罚单:奥斯卡停赛八场罚4万 上港被罚9万
女硕士笔试面试第一被徐州人社局拒录 官方回应
“中国好老板”又上线!黄晓明给员工放假躲雨
滴滴回应作家六六:动态调价加价费用100%归司机
阿富汗一银行遭炸药车袭击29人死亡 当时多人正取钱
韩国防部:朝外交官“暂停核试”言论不值一评
北京重庆等12地高考分数线公布,湖北等多地今日发布
土壤污染防治法草案:污染地块不得作为住宅用地
中国学生在美跳海身亡 死者父亲将赴美处理后事
把他们组合起来:
游客,如果您要查看本帖隐藏内容请回复

[/i]

结果:
于欢案二审宣判:原判量刑过重 无期改判5年
http://news.qq.com/a/20170623/011044.htm
苹果发布官方声明:去年下半年开始已移除10万app
http://digi.tech.qq.com/a/20170623/022898.htm
巴西众院弹劾总统案获通过 罗塞夫政党承认落败
http://news.qq.com/a/20160418/023091.htm
美媒:美国男子被控向中国传递绝密文件 或被判死刑
http://news.qq.com/a/20170623/015424.htm
乐视还债表现不佳 仁宝电脑暂停向乐视致新入股7亿元
http://tech.qq.com/a/20170623/020852.htm
LinkedIn中国总裁沈博阳离职 曾志恒任代理中国总裁
http://tech.qq.com/a/20170623/024206.htm
创6个月新高 !万科A大涨近9% 分析称深铁入主是利好
http://stock.qq.com/a/20170623/018153.htm
董明珠谈上手机开机画面:不是因为我美
http://tech.qq.com/a/20170623/009320.htm
人社部:养老保险基金在东北出现当期收不抵支
http://news.qq.com/a/20170623/020843.htm
河北发布雄安新区交通规划:将以轨道交通为主
http://news.qq.com/a/20170623/020322.htm
“中国史”不属于历史学专业?女生报考公务员被拒
http://news.qq.com/a/20170623/008309.htm
崔顺实首罪宣判:因涉嫌妨碍业务等罪获刑3年
http://news.qq.com/a/20170623/015176.htm
篮球场暂时关闭,洛阳广场舞大爷大妈占领羽毛球场
http://news.qq.com/a/20170623/004635.htm
深圳一房企被爆欠薪3000万 房企“钱荒”来临?
http://news.qq.com/a/20170623/001194.htm
实地探访“巴铁”投资方 投资者三句不离“兑付”
http://news.qq.com/a/20170623/001047.htm
特朗普建议把美墨边境墙修成太阳能墙:越高价值越大
http://news.qq.com/a/20170623/002015.htm
泰国国王在德国遭两名少年用橡皮子弹射击 未被击中
http://news.qq.com/a/20170623/001868.htm
军队武警部队停止有偿服务如何做补偿?官方回应
http://news.qq.com/a/20170623/001891.htm
日媒:安倍ZF拟修改和平宪法,将自卫队地位明文化
http://news.qq.com/a/20170623/001954.htm
北约战机威胁俄防长座机被驱离 俄官员:下流行为
http://news.qq.com/a/20170623/001391.htm
特斯拉独家回应:正与上海市ZF讨论建厂可能性
http://tech.qq.com/a/20170622/057876.htm
深山丛林暗藏制毒窝点 警方在悬崖上开辟抓捕通道
http://news.qq.com/a/20170623/001224.htm
万达复星遭“股债双杀” 是监管进深水区结的果?
http://news.qq.com/a/20170623/001299.htm
俄外交部:IS头目巴格达迪“很可能已经被消灭”
http://news.qq.com/a/20170622/052991.htm
校园贷诈骗案数据:大学生从受骗者变施骗者
http://news.qq.com/a/20170623/001274.htm
文在寅:萨德部署“神秘”加速 已有2架发射台部署
http://news.qq.com/a/20170622/053439.htm
巴拿马总统明确称两岸“外交休兵”已结束 中方回应
http://news.qq.com/a/20170622/046523.htm
遭遇股价狂跌 复星仍忙着在俄罗斯买地产和黄金项目
http://finance.qq.com/a/20170622/053428.htm
危地马拉沿岸近海发生6.8级地震 震源深度40千米
http://news.qq.com/a/20170622/052374.htm
杭州豪宅大火母子4人遇难 34岁保姆有重大作案嫌疑
http://news.qq.com/a/20170622/042882.htm
乐视拖欠中移动费用 290G带宽或被下线
http://tech.qq.com/a/20170622/043507.htm
国乒意外频出士气低迷 王楠老公曝全队已被禁声
http://sports.qq.com/a/20170622/047401.htm
足协重磅罚单:奥斯卡停赛八场罚4万 上港被罚9万
http://sports.qq.com/a/20170622/041502.htm
女硕士笔试面试第一被徐州人社局拒录 官方回应
http://news.qq.com/a/20170622/038445.htm
“中国好老板”又上线!黄晓明给员工放假躲雨
http://ent.qq.com/a/20170622/020317.htm
滴滴回应作家六六:动态调价加价费用100%归司机
http://tech.qq.com/a/20170622/039913.htm
阿富汗一银行遭炸药车袭击29人死亡 当时多人正取钱
http://news.qq.com/a/20170622/043382.htm
韩国防部:朝外交官“暂停核试”言论不值一评
http://news.qq.com/a/20170622/040303.htm
北京重庆等12地高考分数线公布,湖北等多地今日发布
http://edu.qq.com/a/20170622/040148.htm
土壤污染防治法草案:污染地块不得作为住宅用地
http://news.qq.com/a/20170622/026520.htm
中国学生在美跳海身亡 死者父亲将赴美处理后事
http://news.qq.com/a/20170622/034117.htm

(3)保存到本地

使用urllib.request.urlretrieve即可。首先要在对应目录下存在文件夹。

三、完整代码实现
[hide]import requests
import re
import urllib.request
url = "http://news.qq.com/"
requests.get(url).encodeing = "utf-8"
data = requests.get(url).text
#print(len(data))
pat = '<div class="text">.*?<a target="_blank" class="linkto" href="(.*?)"'
pat1 = '<div class="text">.*?<a target="_blank" class="linkto" href=".*?">(.*?)</a>'
allurl = re.compile(pat,re.S).findall(data)
alltitle = re.compile(pat1,re.S).findall(data)
for i in range(0,len(alltitle)):
    print(alltitle[i]+"\n"+allurl[i])
    urllib.request.urlretrieve(allurl[i],"f:/news/"+alltitle[i]+'.html')[/hide]
结果,可以在相应的文件夹看到:
图片2.png

在这个项目的实现过程中,正则表达式的不同,会导致结果的不同,但主要思想是相同的:先爬取网页,用正则表达式提取出新闻链接和标题,在存储到本地。







评分

参与人数 2荣誉 +2 鱼币 +11 贡献 +2 收起 理由
流月飞星 + 2 + 3 + 2
小甲鱼 + 8 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-23 15:45:47 | 显示全部楼层
这么好的帖子竟然没人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-15 20:20:48 | 显示全部楼层
支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-17 07:55:36 | 显示全部楼层
非常好,我学习去了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-19 18:25:50 | 显示全部楼层
111111212
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-27 10:53:51 | 显示全部楼层
感谢老铁
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-28 16:09:24 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-11 17:14:54 | 显示全部楼层
666666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-12 09:52:39 | 显示全部楼层

学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 20:56:17 | 显示全部楼层
很不错,怎么控制获得的数量呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-2 21:42:31 | 显示全部楼层
学习!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-5 10:56:48 | 显示全部楼层
感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-5 11:10:10 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-22 22:54:21 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-23 16:37:14 | 显示全部楼层
谢谢分享zsbd
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-24 20:10:23 | 显示全部楼层
看看,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-27 21:26:43 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-25 17:17:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-25 17:50:40 | 显示全部楼层
看看,感谢看看,感谢看看,感谢看看,感谢看看,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-26 05:28:10 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 13:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表