Python爬虫实战Urllib抓取段子

接上篇Python爬虫正则表达式详解,本文详细介绍了如何使用Urllib抓取糗事百科的段子。


系列文章

Python3 基础教程最全总结
Python3 进阶教程最全总结

一文掌握Python基础知识
一文掌握Python列表/元组/字典/集合
一文掌握Python函数用法
Python面向对象之类与对象详解
Python面向对象之装饰器与封装详解
Python面向对象之继承和多态详解
Python异常处理和模块详解
Python文件(I/O)操作详解

Python网络编程之Socket原理与基本用法
Python多线程threading模块基本用法

Python爬虫正则表达式详解 爬爬爬爬个虫子
Python爬虫实战Urllib抓取段子
Python爬虫实战抓包分析视频评论
Python爬虫实战Requests抓取博客文章
Python爬虫实战Scrapy抓取商品信息并写入数据库



文章目录

  • 系列文章
  • 1. XPath 表达式
  • 2. Urllib 模块
  • 3. urllib.request 模块
    • 3.1 简介
    • 3.2 将爬取的数据保存到本地
    • 3.3 浏览器伪装
    • 3.4 用户代理池
  • 4.实战:爬取糗事百科段子
    • 4.1 从网页源码中获取内容字段
    • 4.2 完整代码


1. XPath 表达式

除了正则表达式之外,还有一些非常好用的信息筛选的工具,比如XPath表达式、Beautiful Soup等等。XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

XPath的知识点还是比较多的,需要XML和HTML相关知识储备,但是本文中并不做过多探讨,仅提及一些常用语法。XPath表达式常用语法如下:

  • /:逐层提取;
  • text():提取标签下面的文本;
  • //标签名**:提取所有名为**的标签;
  • //标签名[@属性='属性值']:提取属性为XX的标签;
  • @属性名:代表取某个属性值;

想参考更多XPath的相关信息,请访问该教程。


2. Urllib 模块

urllib是Python内置的模块,包含四个模块:

  • urllib.request for opening and reading URLs
  • urllib.error containing the exceptions raised by urllib.request
  • urllib.parse for parsing URLs
  • urllib.robotparser for parsing robots.txt files

urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应,本文的的实例也是基于该模块。更过urllib模块的相关信息,请访问官方文档。


3. urllib.request 模块

3.1 简介

导入比必要的包:

import urllib
from urllib import request

调用 urlopen() 方法,爬取京东主页数据:

data_jd = request.urlopen("https://www.jd.com").read().decode("utf-8","ignore")
len(data_jd) # 判断有没有读取到数据

'''
输出:109390 #说明读取到了数据
'''

使用正则表达式读取页面题头:

import re
pat = "(.*?)" #正则表达式
re.compile(pat,re.S).findall(data_jd)

data_csdn = request.urlopen("https://www.csdn.net").read().decode("utf-8","ignore")
re.compile(pat,re.S).findall(data_csdn)
'''
返回:['京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!']
返回:['CSDN-专业IT技术社区']
'''

3.2 将爬取的数据保存到本地

以上操作爬取的内容都保存到了内存中,如果想保存到硬盘中,可以使用 urlretrieve() 方法:

url_jd = "https://www.jd.com"
save_path = "D:/Project/05 Python/jd.html"
request.urlretrieve(url_jd, filename = save_path)

3.3 浏览器伪装

1.查看浏览器用户代理
Python爬虫实战Urllib抓取段子_第1张图片
2.完整代码

opener = request.build_opener() #创建opener对象
user_agent_key = "User-Agent" #用户代理的键
user_agent_value = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" #用户代理的值
user_agent_info = (user_agent_key, user_agent_value)

opener.addheaders = [user_agent_info] #修改头信息
request.install_opener(opener) #将opener对象设置为全局有效

data = request.urlopen(url_jd).read().decode("utf-8","ignore")
len(data)

'''
109679
'''

3.4 用户代理池

反爬措施之一,模拟不同的浏览器访问网站。

import random
user_agent_pools = []

user_agent_key = "User-Agent"
pool_choice = random.choice(pools)
user_agent = ("User-Agent",pool_choice)

完整代码,爬取京东首页数据:

import urllib
from urllib import request
import random
import re

def user_agent_func(pools, user_agent):
    opener = request.build_opener()
    pool_choice = random.choice(pools)
    user_agent = ("User-Agent",pool_choice)
    opener.addheaders = [user_agent]
    request.install_opener(opener)
    print("当前使用的用户代理为:",pool_choice)

if __name__ == "__main__":

url_jd = "https://www.jd.com"

user_agent_pools = [
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
    "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
    "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14"
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
]

# 每爬两次次换一次用户代理
for i in range(0,6):
    if (i%1 == 0):
        user_agent_func(user_agent_pools,user_agent_info)
    data_jd = urllib.request.urlopen(url_jd).read().decode("utf-8","ignore")
    print(len(data_jd))

输出:

当前使用的用户代理为: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7
109098
当前使用的用户代理为: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5
109098
当前使用的用户代理为: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14
109098
当前使用的用户代理为: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7
109098
当前使用的用户代理为: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5
109098
当前使用的用户代理为: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14
109098

4.实战:爬取糗事百科段子

4.1 从网页源码中获取内容字段

1.打开官网:https://www.qiushibaike.com/text/
2.右侧空白处右击“查看网页源码”(我使用的是chrome浏览器):
Python爬虫实战Urllib抓取段子_第2张图片
3.找内容字段用于XPath表达式匹配
Python爬虫实战Urllib抓取段子_第3张图片
注意学习文中内容,每天一点分手小技巧,分手路上不迷路。。。

经过分析,我们知道包含内容的字段为:

,我们先把这段内容暂时保存以下,方便学习分手知识待会写代码:

<div class="content">
<span>


男生恋爱小常识:<br/>1、两个人出去,如果恰好有风,不要只顾着自己走,要记得帮她掀开刘海;<br/><br/>2、大姨妈来,她不能吃凉的,所以得照顾她的感受,当着她的面吃冰淇淋就不要吃出声来;<br/><br/>3、真实自然的美才是真的美,试试将她的素颜照发到微博;<br/><br/>4、无论如何不能让她累着,吃饱饭后要第一时间把她抱到床上躺好;<br/><br/>5、晚上不要打扰她睡觉,千万不要说晚安,直接关机;<br/><br/>6、出去玩也别和她说,免得她担心;<br/><br/>7、记得和她闺蜜打的火热,她会觉得你很贴心会做人;<br/><br/>8、她病了无论头疼胃疼姨妈疼 千万不要做给她买药嘱咐她
…
</span>

<span class="contentForAll">查看全文</span>

</div>

使用XPath表达式代码:

pat = '
.*?(.*?).*?
'

4.分析页码规律
因为要多页爬取,所以要分析不同页码的网页地址命名规律,经过几次翻页不难发现:

第二页:https://www.qiushibaike.com/text/page/2/
第三页:https://www.qiushibaike.com/text/page/3/
第四页:https://www.qiushibaike.com/text/page/4/
...

最后一个字段为页码数,我们可以用循环的方式实现。

page_url = "https://www.qiushibaike.com/text/page/"+str(i+1)+"/"

4.2 完整代码

import urllib
from urllib import request
import random
import re

def user_agent_func(pools, user_agent):
    opener = request.build_opener()
    pool_choice = random.choice(pools)
    user_agent = ("User-Agent",pool_choice)
    opener.addheaders = [user_agent]
    request.install_opener(opener)
    print("当前使用的用户代理为:",pool_choice)

if __name__ == "__main__":

url_jd = "https://www.jd.com"

user_agent_pools = [
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
    "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
    "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14"
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
]

total_page = 1 #爬取页码数,手下留情啊

for i in range(0,total_page):
    user_agent_func(user_agent_pools,user_agent_info)
    page_url = "https://www.qiushibaike.com/text/page/"+str(i+1)+"/"
    try:
        data = request.urlopen(page_url).read().decode("utf-8","ignore")
        pat = '
.*?(.*?).*?
'
#截取内容字段 rst = re.compile(pat, re.S).findall(data) for j in range(0, len(rst)): print(rst[j]) print("------") except Exception as error: #异常处理,如果出现异常直接跳过 pass

输出内容:

当前使用的用户代理为: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9



老家院子有棵杨 桃 树,搬家后回老家少了,那年我爸带我们回去准备把树砍掉,怕时间久了落叶什么的没人打扫太脏。<br/>​我哭着抱住杨 桃 树,跟我爸说:杨桃树是我的小伙伴,从小它陪着我长大,它会开花结果给我杨 桃吃,还可以乘凉 荡 秋 千,我不想您砍掉它。<br/>我爸突然红了眼:这样说来,我也是它陪着长大的呢,但我想起小时候一闯祸你爷爷就把我绑在​这棵树上揍我,我一点都不心疼……


------



跟同事暧昧好久了,他虽然明显表示对我的好感,可迟迟不肯表白。<br/>今天我特意起了个大早做了份爱心早餐,想送给他吃顺便问问他的想法。哪成想到了公司却看到他跟别的女生打情骂俏,“腾”一下火就上来了,却又暗自窃喜没有表白。<br/>他看到我来了,过来跟我说话,眼尖的看到便当,问我:这该不会是给我吃的吧?<br/>我笑嘻嘻的回他:喂狗的!


------



几天没有回家,发现老爸憔悴了,郁郁寡欢的,我忙问怎么了,老爸叹气说,家里大家都嫌弃他,没人陪他看电视!我忙说我不嫌弃,我陪他看!<br/>晚上快十二点了,收拾下准备睡觉,老爸神秘兮兮地来叫我,说让我陪他看电视,我没多想,就去客厅,发现客厅里灯都关着,只有电视机开着,冒着诡异的光,音乐也特瘆得慌,我鸡皮疙瘩都起了,问老爸这是看啥!老爸诡异地笑:恐怖片!<br/>我听着那吓人的音乐,转头就要回房间,老爸一把拉住我,瞪着我说:白天谁说陪我看电视的?说话要算数!你敢跑我就打死你!


------



「转」<br/>悠悠白云悠悠过,涛涛江水涛涛流。<br/>英雄一去不复还,徒留遗恨业未就。<br/>化做龟蛇镇江汉,再做雷火驱鬼魔。<br/>唯愿中华万世安,清风陪我听凯歌。<br/>致敬,我的祖国!<br/>致敬,英雄的中国人民!


------



今天,不更糗事,不打游戏。沉痛悼念抗疫英烈、救火英雄和在疫情中牺牲的同胞。[比心][比心][比心]


------



最合适的婚姻:一屋两人,三餐四季,狗在跑,我在闹,你在笑。夏天的傍晚一起散步,回家的路上顺手买一个西瓜,你说“太重我来提吧”。


------



男友生病了,领导来看他,他让我切点哈密瓜来招待领导。<br/>我小声对他说哈密瓜我吃完了,他充耳不闻。我去厨房的时候,看到他发来信息:谁让你把我最喜欢的都吃了,就这么治你!<br/>于是我打开榴莲,拿出来,对着领导说:这是昨天花了一百多块钱,买了个榴莲,大家尝尝鲜!<br/>我把榴莲皮留着,备用[奸笑]


------



追求公司外贸部的女孩,看到她发的朋友圈说:又到了每个月最痛苦的时候!<br/>我赶紧在网上查找各种治疗痛经的偏方,又买了红糖姜茶送到她办公室。过几天才知道她和另一个追求她的男同事在一起了。<br/>我以为她需要红糖,而男同事帮她还了花呗!


------



我姐跟我开视频聊天,抱怨她儿子:“你不知道,自从在家上网课,他每天太累了,累的我都心疼!”我大外甥马上过来跟我撒娇:“小姨,我妈都说我累,你是不是得奖励奖励我?”我姐瞬间把手机放下,我盯着天花板听着那边我姐揍娃的动静,一边揍还一边叨叨:“你可不就累坏了么,一整天不是找课本就是找本子,还间歇性找笔找眼镜,还想要奖励……”


------:老婆!你这天天化妆,晚上再卸妆,是不是很浪费化妆品?<br/>老婆:你这天天吃那么多,后来还不是都 拉 出了,是不是很浪费粮食……<br/>卧槽,我居然被呛的说不出话来!!!


------



老家隔壁养了只大鹅,回家去邻居家串门,他家的鹅对我狂叫。<br/>我对邻居开玩笑说:等养肥了哈,试试一锅能炖下了不。。<br/>结果没过几天他的鹅就不见了,邻居每到吃饭时都到我家转转,还时不时进我家厨房看看。<br/>临走时小声念念有词说我不仗义,吃没事,关键是没喊他。。。。。<br/>再这样下去,我真的感觉像偷吃了他家鹅了。。。。


------



:少年,我看你天庭饱满,地阁方圆,定非池中之物哇!<br/>:大爷,谢谢您,不过您能不能先搭把手,先把我从池塘里拉上去。


------



网上买了个法拉利打火机钥匙,去夜店准备玩玩,到了个旁边妹子挺多的桌子旁,把法拉利钥匙往桌子上一拍,钥匙居然直接炸了……


------



夜里起夜,去卫生间路过儿子房间,听到是儿子打游戏的声音:左   边  有  人,后  面  后  面,你个沙雕完 了吧。<br/>想着在家呆了两月也挺不容易的,算了不管了。<br/><br/>回床上刷这坨,看到群有说大号废了整个小号玩的,一笑把老婆吵醒了。<br/>老婆问我大半夜不睡觉,笑啥呢,我对她说:网上说大号废了,可以下载个小号玩玩。。<br/><br/>一大早被儿子大声背英语的声音吵醒了。。。


------



舅子前段时间醉酒后,把他老婆打了一顿,其实我知道他是假装醉酒打的,因为他老婆太作!……<br/><br/>昨晚舅子在我家喝酒,两杯下肚后和我叫嚣:姐夫,你这个人我就瞧不起,我敢打老婆你敢吗?男人不能怕老婆,怕老婆的男人没出息……<br/><br/>我看了看舅子老婆,慢慢的喝了口酒:你姐是我第二个老婆,你呢?你敢找第二个老婆吗??<br/><br/>唉,害人的酒啊,我和舅子各自在车上睡了一夜!!……


------



肚子疼好几天了,去看医生。<br/>坐诊的医生是个小鲜肉,就是态度不咋好。<br/>因为他不耐烦的对我说:姐,都一个多小时了,你看够没有?<br/>我要不要投诉他?


------



在家无聊,就从手机上学着做雪花酥牛轧糖,做好送给了家里有宝宝的表姐。<br/>今天表姐发来信息:如果妮妮还向你要糖,别给她啊!她天天吵着要找你呢!我回复ok!<br/>然后她发来视频,是她家宝贝妮妮:“谢谢小姨,你做的糖真好吃!我换牙不能多吃,我要每天只吃一个,这样可以吃好久好久”<br/>额,是我和她妈妈把孩子想复杂了!


------



半个月前小舅子给我炫耀说他晚上给工地帮忙搬砖,四个小时可以有两百私房钱,还问我干不?好不容易有个存私房钱的机会,当然干了,于是骗老婆说加班实则去搬砖……<br/>昨晚,搬完砖回家,见到楼上李阿姨,她是这样说的:哎呀!我说小王啊,你不能太宠你老婆呀,为了给她买个包包,天天去搬砖。。。。


------



天天白天晚上玩手机,颈椎有点不舒服,于是试着不用枕头睡觉,快天明的时候,觉得闷,喘不上气的感觉,看来不用枕头不行。<br/>我和妈妈说了这事,我妈很严谨的检查了下我,然后说:过个年你的背膀又厚了,相当于仰头睡!!!


------



我二叔家曾经养了个狼犬,那是真厉害谁进他们家的院都不行,可是有一次我二叔家的蘑菇棚着火之后那狼犬吓出问题了,白天对人虎视眈眈的,到晚上吓的直接头钻墙洞里来人都不 叫唤,我二叔气的骂它:“白天那么厉害有啥用晚上来个人你连 叫 都不 叫 ”,可是骂了几次发现白天晚上都不 叫 了,而且一来人直接吓的撒尿了……


------



今晚到爸妈那吃饭,老妈做了一桌很丰盛的菜,准备吃的时间,老爸突然生起气来,横鼻子竖眼睛的把我骂了一顿……<br/><br/>说真话,我有点懵……<br/><br/>就在我快憋不准顶撞几句的时间,老妈从厨房拿了瓶米酒,晃了晃对老爸说:米酒可以喝点,高度白酒想都别想,骂也没用……<br/><br/>唉……我爸喝着米酒把我骂了一个多小时,怪我没给他买高度白酒!!


------



二嫂发动态:我要减肥了,先定个小目标,减个二十斤!<br/>我在下面评论:二嫂顺便帮我也减了呗!我不想自己 努力了!


------



给儿子买了双溜冰鞋,儿子害怕不敢溜,我穿上溜冰鞋说:看好了!看老爸给你来个漂移。刚迈开脚,华丽丽的摔了一脚。<br/>儿子拍着手喊:爸爸好棒!并跑出去喊来邻居小朋友和他妈妈,非让我再表演一次……


------



老公的糗事,开车出门尿急,一路也没有找到公厕。实在憋不住了,看到一个隐蔽的墙角,打算去释放一下内存。尿到一半,听到墙头喇叭响了:您已在监控区域,请快速离开……


------



第一次去女友家,那天太阳很辣,我们吃好饭去干活时,女友递了个帽子给我道:戴着,太阳太大了,等下晒褪皮,我:不用没事,晒晒好补钙,<br/>这时叔叔看着我道:小伙子一看你就是耐晒的那种人,<br/>我有些好奇的看着叔叔,叔叔:不然不会这么黑…


------
1

更多实战在下文介绍~


参考:
相关课程:https://edu.aliyun.com/course/1994
京东爸爸:https://www.jd.com/
用户代理池:https://www.cnblogs.com/nixingguo/p/7253197.html
urllib官方文档:https://docs.python.org/3/library/urllib.html
XPath教程:https://www.w3school.com.cn/index.html
urllib教程:https://www.liaoxuefeng.com/wiki/1016959663602400/1019223241745024

你可能感兴趣的:(Python)