爬虫:数据解析三种方式
正则解析
常用的正则表达式的回顾
单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [0-9] \D : 非数字 \w :数字、字母、下划线、中文 \W : 非\w \s :所有的空白字符包,括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S : 非空白 数量修饰: * : 任意多次 >=0 + : 至少1次 >=1 ? : 可有可无 0次或者1次 {m} :固定m次 hello{3,} {m,} :至少m次 {m,n} :m-n次 边界: $ : 以某某结尾 ^ : 以某某开头 分组: (ab) 贪婪模式: .* 非贪婪(惰性)模式: .*? re.I : 忽略大小写 re.M :多行匹配 re.S :单行匹配 re.sub(正则表达式, 替换内容, 字符串)
示例1:爬取糗事百科指定页面的糗图,并将其保存到指定文件夹中
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests import re import os if __name__ == "__main__": url = 'https://www.qiushibaike.com/pic/%s/' headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #指定起始也结束页码 page_start = int(input('enter start page:')) page_end = int(input('enter end page:')) #创建文件夹 if not os.path.exists('images'): os.mkdir('images') #循环解析且下载指定页码中的图片数据 for page in range(page_start,page_end+1): print('正在下载第%d页图片'%page) new_url = format(url % page) response = requests.get(url=new_url,headers=headers) #解析response中的图片链接 e = '<div class="thumb">.*?<img src="(.*?)".*?>.*?</div>' pa = re.compile(e,re.S) image_urls = pa.findall(response.text) #循环下载该页码下所有的图片数据 for image_url in image_urls: image_url = 'https:' + image_url image_name = image_url.split('/')[-1] image_path = 'images/'+image_name image_data = requests.get(url=image_url,headers=headers).content with open(image_path,'wb') as fp: fp.write(image_data)
BeautifulSoup (bs4) 解析
1、环境安装
- 需要将pip源设置为国内源,阿里源、豆瓣源、网易源等
- windows
(1)打开文件资源管理器(文件夹地址栏中)
(2)地址栏上面输入 %appdata%
(3)在这里面新建一个文件夹 pip
(4)在pip文件夹里面新建一个文件叫做 pip.ini ,内容写如下即可
[global]
timeout = 6000
index-url = https://mirrors.aliyun.com/pypi/simple/
trusted-host = mirrors.aliyun.com
- linux
(1)cd ~
(2)mkdir ~/.pip
(3)vi ~/.pip/pip.conf
(4)编辑内容,和windows一模一样
- 需要安装:pip install bs4
bs4在使用时候需要一个第三方库lxml,因此把这个库也安装一下
pip install lxml
2、bs4 解析的语法
注意点: .string 获取的是直系文本
.text 获取的子代的文本
.json() 获取的是json数据
3、解析原理
- 1.将即将要进行解析的源码加载到bs对象
- 2.调用bs对象中相关的方法或属性进行源码中的相关标签的定位
- 3.将定位到的标签之间存在的文本或者属性值获取
4、示例,
需求: 使用bs4实现将诗词名句网站中三国演义小说的每一章的内容爬去到本地磁盘进行存储
http://www.shicimingju.com/book/sanguoyanyi.html
#获取章节和内容 import requests from bs4 import BeautifulSoup import lxml url = 'http://www.shicimingju.com/book/sanguoyanyi.html' headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36' } page_text = requests.get(url = url,headers=headers).text soup = BeautifulSoup(page_text,"lxml") a_list = soup.select(".book-mulu > ul > li > a") #返回的是列表,包含标签元素 f = open("./sanguo.txt","w",encoding="utf-8") for a in a_list: title = a.string detail_url = "http://www.shicimingju.com" + a["href"] detail_page = requests.get(url=detail_url,headers=headers).text #获取的是text,整个html的字符串 soup1 = BeautifulSoup(detail_page,"lxml") text = soup1.find("div",class_="chapter_content").text # class_ 表示类名 f.write(title+"\n"+text) print(title+"下载完毕!") print("over...")
标签元素的示例,根据该字符串写 bs4 语法:

''' <div class="book-mulu"> <ul> <li><a href="/book/sanguoyanyi/1.html">第一回·宴桃园豪杰三结义 斩黄巾英雄首立功</a></li><li><a href="/book/sanguoyanyi/2.html">第二回·张翼德怒鞭督邮 何国舅谋诛宦竖</a></li><li><a href="/book/sanguoyanyi/3.html">第三回·议温明董卓叱丁原 馈金珠李肃说吕布</a></li><li><a href="/book/sanguoyanyi/4.html">第四回·废汉帝陈留践位 谋董贼孟德献刀</a></li><li><a href="/book/sanguoyanyi/5.html">第五回·发矫诏诸镇应曹公 破关兵三英战吕布</a></li><li><a href="/book/sanguoyanyi/6.html">第六回·焚金阙董卓行凶 匿玉玺孙坚背约</a></li><li><a href="/book/sanguoyanyi/7.html">第七回·袁绍磐河战公孙 孙坚跨江击刘表</a></li><li><a href="/book/sanguoyanyi/8.html">第八回·王司徒巧使连环计 董太师大闹凤仪亭</a></li><li><a href="/book/sanguoyanyi/9.html">第九回·除暴凶吕布助司徒 犯长安李傕听贾诩</a></li><li><a href="/book/sanguoyanyi/10.html">第一十回·勤王室马腾举义 报父仇曹操兴师</a></li><li><a href="/book/sanguoyanyi/11.html">第十一回·刘皇叔北海救孔融 吕温侯濮阳破曹操</a></li><li><a href="/book/sanguoyanyi/12.html">第十二回·陶恭祖三让徐州 曹孟德大战吕布</a></li><li><a href="/book/sanguoyanyi/13.html">第十三回·李傕郭汜大交兵 杨奉董承双救驾</a></li><li><a href="/book/sanguoyanyi/14.html">第十四回·曹孟德移驾幸许都 吕奉先乘夜袭徐郡</a></li><li><a href="/book/sanguoyanyi/15.html">第十五回·太史慈酣斗小霸王 孙伯符大战严白虎</a></li><li><a href="/book/sanguoyanyi/16.html">第十六回·吕奉先射戟辕门 曹孟德败师淯水</a></li><li><a href="/book/sanguoyanyi/17.html">第十七回·袁公路大起七军 曹孟德会合三将</a></li><li><a href="/book/sanguoyanyi/18.html">第十八回·贾文和料敌决胜 夏侯惇拔矢啖睛</a></li><li><a href="/book/sanguoyanyi/19.html">第十九回·下邳城曹操鏖兵 白门楼吕布殒命</a></li><li><a href="/book/sanguoyanyi/20.html">第二十回·曹阿瞒许田打围 董国舅内阁受诏</a></li><li><a href="/book/sanguoyanyi/21.html">第二十一回·曹操煮酒论英雄 关公赚城斩车胄</a></li><li><a href="/book/sanguoyanyi/22.html">第二十二回·袁曹各起马步三军 关张共擒王刘二将</a></li><li><a href="/book/sanguoyanyi/23.html">第二十三回·祢正平裸衣骂贼 吉太医下毒遭刑</a></li><li><a href="/book/sanguoyanyi/24.html">第二十四回·国贼行凶杀贵妃 皇叔败走投袁绍</a></li><li><a href="/book/sanguoyanyi/25.html">第二十五回·屯土山关公约三事 救白马曹操解重围</a></li><li><a href="/book/sanguoyanyi/26.html">第二十六回·袁本初败兵折将 关云长挂印封金</a></li><li><a href="/book/sanguoyanyi/27.html">第二十七回·美髯公千里走单骑 汉寿侯五关斩六将</a></li><li><a href="/book/sanguoyanyi/28.html">第二十八回·斩蔡阳兄弟释疑 会古城主臣聚义</a></li><li><a href="/book/sanguoyanyi/29.html">第二十九回·小霸王怒斩于吉 碧眼儿坐领江东</a></li><li><a href="/book/sanguoyanyi/30.html">第三十回·战官渡本初败绩 劫乌巢孟德烧粮</a></li><li><a href="/book/sanguoyanyi/31.html">第三十一回·曹操仓亭破本初 玄德荆州依刘表</a></li><li><a href="/book/sanguoyanyi/32.html">第三十二回·夺冀州袁尚争锋 决漳河许攸献计</a></li><li><a href="/book/sanguoyanyi/33.html">第三十三回·曹丕乘乱纳甄氏 郭嘉遗计定辽东</a></li><li><a href="/book/sanguoyanyi/34.html">第三十四回·蔡夫人隔屏听密语 刘皇叔跃马过檀溪</a></li><li><a href="/book/sanguoyanyi/35.html">第三十五回·玄德南漳逢隐沧 单福新野遇英主</a></li><li><a href="/book/sanguoyanyi/36.html">第三十六回·玄德用计袭樊城 元直走马荐诸葛</a></li><li><a href="/book/sanguoyanyi/37.html">第三十七回·司马徽再荐名士 刘玄德三顾草庐</a></li><li><a href="/book/sanguoyanyi/38.html">第三十八回·定三分隆中决策 战长江孙氏报仇</a></li><li><a href="/book/sanguoyanyi/39.html">第三十九回·荆州城公子三求计 博望坡军师初用兵</a></li><li><a href="/book/sanguoyanyi/40.html">第四十回·蔡夫人议献荆州 诸葛亮火烧新野</a></li><li><a href="/book/sanguoyanyi/41.html">第四十一回·刘玄德携民渡江 赵子龙单骑救主</a></li><li><a href="/book/sanguoyanyi/42.html">第四十二回·张翼德大闹长坂桥 刘豫州败走汉津口</a></li><li><a href="/book/sanguoyanyi/43.html">第四十三回·诸葛亮舌战群儒 鲁子敬力排众议</a></li><li><a href="/book/sanguoyanyi/44.html">第四十四回·孔明用智激周瑜 孙权决计破曹操</a></li><li><a href="/book/sanguoyanyi/45.html">第四十五回·三江口曹操折兵 群英会蒋干中计</a></li><li><a href="/book/sanguoyanyi/46.html">第四十六回·用奇谋孔明借箭 献密计黄盖受刑</a></li><li><a href="/book/sanguoyanyi/47.html">第四十七回·阚泽密献诈降书 庞统巧授连环计</a></li><li><a href="/book/sanguoyanyi/48.html">第四十八回·宴长江曹操赋诗 锁战船北军用武</a></li><li><a href="/book/sanguoyanyi/49.html">第四十九回·七星坛诸葛祭风 三江口周瑜纵火</a></li><li><a href="/book/sanguoyanyi/50.html">第五十回·诸葛亮智算华容 关云长义释曹操</a></li><li><a href="/book/sanguoyanyi/51.html">第五十一回·曹仁大战东吴兵 孔明一气周公瑾</a></li><li><a href="/book/sanguoyanyi/52.html">第五十二回·诸葛亮智辞鲁肃 赵子龙计取桂阳</a></li><li><a href="/book/sanguoyanyi/53.html">第五十三回·关云长义释黄汉升 孙仲谋大战张文远</a></li><li><a href="/book/sanguoyanyi/54.html">第五十四回·吴国太佛寺看新郎 刘皇叔洞房续佳偶</a></li><li><a href="/book/sanguoyanyi/55.html">第五十五回·玄德智激孙夫人 孔明二气周公瑾</a></li><li><a href="/book/sanguoyanyi/56.html">第五十六回·曹操大宴铜雀台 孔明三气周公瑾</a></li><li><a href="/book/sanguoyanyi/57.html">第五十七回·柴桑口卧龙吊丧 耒阳县凤雏理事</a></li><li><a href="/book/sanguoyanyi/58.html">第五十八回·马孟起兴兵雪恨 曹阿瞒割须弃袍</a></li><li><a href="/book/sanguoyanyi/59.html">第五十九回·许诸裸衣斗马超 曹操抹书问韩遂</a></li><li><a href="/book/sanguoyanyi/60.html">第六十回·张永年反难杨修 庞士元议取西蜀</a></li><li><a href="/book/sanguoyanyi/61.html">第六十一回·赵云截江夺阿斗 孙权遗书退老瞒</a></li><li><a href="/book/sanguoyanyi/62.html">第六十二回·取涪关杨高授首 攻雒城黄魏争功</a></li><li><a href="/book/sanguoyanyi/63.html">第六十三回·诸葛亮痛哭庞统 张翼德义释严颜</a></li><li><a href="/book/sanguoyanyi/64.html">第六十四回·孔明定计捉张任 杨阜借兵破马超</a></li><li><a href="/book/sanguoyanyi/65.html">第六十五回·马超大战葭萌关 刘备自领益州牧</a></li><li><a href="/book/sanguoyanyi/66.html">第六十六回·关云长单刀赴会 伏皇后为国捐生</a></li><li><a href="/book/sanguoyanyi/67.html">第六十七回·曹操平定汉中地 张辽威震逍遥津</a></li><li><a href="/book/sanguoyanyi/68.html">第六十八回·甘宁百骑劫魏营 左慈掷杯戏曹操</a></li><li><a href="/book/sanguoyanyi/69.html">第六十九回·卜周易管辂知机 讨汉贼五臣死节</a></li><li><a href="/book/sanguoyanyi/70.html">第七十回·猛张飞智取瓦口隘 老黄忠计夺天荡山</a></li><li><a href="/book/sanguoyanyi/71.html">第七十一回·占对山黄忠逸待劳 据汉水赵云寡胜众</a></li><li><a href="/book/sanguoyanyi/72.html">第七十二回·诸葛亮智取汉中 曹阿瞒兵退斜谷</a></li><li><a href="/book/sanguoyanyi/73.html">第七十三回·玄德进位汉中王 云长攻拔襄阳郡</a></li><li><a href="/book/sanguoyanyi/74.html">第七十四回·庞令明抬榇决死战 关云长放水淹七军</a></li><li><a href="/book/sanguoyanyi/75.html">第七十五回·关云长刮骨疗毒 吕子明白衣渡江</a></li><li><a href="/book/sanguoyanyi/76.html">第七十六回·徐公明大战沔水 关云长败走麦城</a></li><li><a href="/book/sanguoyanyi/77.html">第七十七回·玉泉山关公显圣 洛阳城曹操感神</a></li><li><a href="/book/sanguoyanyi/78.html">第七十八回·治风疾神医身死 传遗命奸雄数终</a></li><li><a href="/book/sanguoyanyi/79.html">第七十九回·兄逼弟曹植赋诗 侄陷叔刘封伏法</a></li><li><a href="/book/sanguoyanyi/80.html">第八十回·曹丕废帝篡炎刘 汉王正位续大统</a></li><li><a href="/book/sanguoyanyi/81.html">第八十一回·急兄仇张飞遇害 雪弟恨先主兴兵</a></li><li><a href="/book/sanguoyanyi/82.html">第八十二回·孙权降魏受九锡 先主征吴赏六军</a></li><li><a href="/book/sanguoyanyi/83.html">第八十三回·战猇亭先主得仇人 守江口书生拜大将</a></li><li><a href="/book/sanguoyanyi/84.html">第八十四回·陆逊营烧七百里 孔明巧布八阵图</a></li><li><a href="/book/sanguoyanyi/85.html">第八十五回·刘先主遗诏托孤儿 诸葛亮安居平五路</a></li><li><a href="/book/sanguoyanyi/86.html">第八十六回·难张温秦宓逞天辩 破曹丕徐盛用火攻</a></li><li><a href="/book/sanguoyanyi/87.html">第八十七回·征南寇丞相大兴师 抗天兵蛮王初受执</a></li><li><a href="/book/sanguoyanyi/88.html">第八十八回·渡泸水再缚番王 识诈降三擒孟获</a></li><li><a href="/book/sanguoyanyi/89.html">第八十九回·武乡侯四番用计 南蛮王五次遭擒</a></li><li><a href="/book/sanguoyanyi/90.html">第九十回·驱巨善六破蛮兵 烧藤甲七擒孟获</a></li><li><a href="/book/sanguoyanyi/91.html">第九十一回·祭泸水汉相班师 伐中原武侯上表</a></li><li><a href="/book/sanguoyanyi/92.html">第九十二回·赵子龙力斩五将 诸葛亮智取三城</a></li><li><a href="/book/sanguoyanyi/93.html">第九十三回·姜伯约归降孔明 武乡侯骂死王朝</a></li><li><a href="/book/sanguoyanyi/94.html">第九十四回·诸葛亮乘雪破羌兵 司马懿克日擒孟达</a></li><li><a href="/book/sanguoyanyi/95.html">第九十五回·马谡拒谏失街亭 武侯弹琴退仲达</a></li><li><a href="/book/sanguoyanyi/96.html">第九十六回·孔明挥泪斩马谡 周鲂断发赚曹休</a></li><li><a href="/book/sanguoyanyi/97.html">第九十七回·讨魏国武侯再上表 破曹兵姜维诈献书</a></li><li><a href="/book/sanguoyanyi/98.html">第九十八回·追汉军王双受诛 袭陈仓武侯取胜</a></li><li><a href="/book/sanguoyanyi/99.html">第九十九回·诸葛亮大破魏兵 司马懿入寇西蜀</a></li><li><a href="/book/sanguoyanyi/100.html">第一百回·汉兵劫寨破曹真 武侯斗阵辱仲达</a></li><li><a href="/book/sanguoyanyi/101.html">第一百十一回·出陇上诸葛妆神 奔剑阁张郃中计</a></li><li><a href="/book/sanguoyanyi/102.html">第一百十二回·司马懿占北原渭桥 诸葛亮造木牛流马</a></li><li><a href="/book/sanguoyanyi/103.html">第一百十三回·上方谷司马受困 五丈原诸葛禳星</a></li><li><a href="/book/sanguoyanyi/104.html">第一百十四回·陨大星汉丞相归天 见木像魏都督丧胆</a></li><li><a href="/book/sanguoyanyi/105.html">第一百十五回·武侯预伏锦囊计 魏主拆取承露盘</a></li><li><a href="/book/sanguoyanyi/106.html">第一百十六回·公孙渊兵败死襄平 司马懿诈病赚曹爽</a></li><li><a href="/book/sanguoyanyi/107.html">第一百十七回·魏主政归司马氏 姜维兵败牛头山</a></li><li><a href="/book/sanguoyanyi/108.html">第一百十八回·丁奉雪中奋短兵 孙峻席间施密计</a></li><li><a href="/book/sanguoyanyi/109.html">第一百十九回·困司马汉将奇谋 废曹芳魏家果报</a></li><li><a href="/book/sanguoyanyi/110.html">第一百一十回·文鸯单骑退雄兵 姜维背水破大敌</a></li><li><a href="/book/sanguoyanyi/111.html">第一百一十一回·邓士载智败姜伯约 诸葛诞义讨司马昭</a></li><li><a href="/book/sanguoyanyi/112.html">第一百一十二回·救寿春于诠死节 取长城伯约鏖兵</a></li><li><a href="/book/sanguoyanyi/113.html">第一百一十三回·丁奉定计斩孙綝 姜维斗阵破邓艾</a></li><li><a href="/book/sanguoyanyi/114.html">第一百一十四回·曹髦驱车死南阙 姜维弃粮胜魏兵</a></li><li><a href="/book/sanguoyanyi/115.html">第一百一十五回·诏班师后主信谗 托屯田姜维避祸</a></li><li><a href="/book/sanguoyanyi/116.html">第一百一十六回·钟会分兵汉中道 武侯显圣定军山</a></li><li><a href="/book/sanguoyanyi/117.html">第一百一十七回·邓士载偷度阴平 诸葛瞻战死绵竹</a></li><li><a href="/book/sanguoyanyi/118.html">第一百一十八回·哭祖庙一王死孝 入西川二士争功</a></li><li><a href="/book/sanguoyanyi/119.html">第一百一十九回·假投降巧计成虚话 再受禅依样画葫芦</a></li><li><a href="/book/sanguoyanyi/120.html">第一百二十回·荐杜预老将献新谋 降孙皓三分归一统</a></li> </ul> </div> ''' ''' <div class="chapter_content"> <br> <p> 却说杨大将献计欲攻刘备。袁术曰:“计将安出?”大将曰:“刘备军屯小沛,虽然易取,奈吕布虎踞徐州,前次许他金帛粮马,至今未与,恐其助备;今当令人送与粮食,以结其心,使其按兵不动,则刘备可擒。先擒刘备,后图吕布,徐州可得也。”术喜,便具粟二十万斛,令韩胤赍密书往见吕布。吕布甚喜,重待韩胤。胤回告袁术,术遂遣纪灵为大将,雷薄、陈兰为副将,统兵数万,进攻小沛。玄德闻知此信,聚众商议。张飞要出战。孙乾曰:“今小沛粮寡兵微,如何抵敌?可修书告急于吕布。”张飞曰:“那厮如何肯来!”玄德曰:“乾之言善。”遂修书与吕布。书略曰:“伏自将军垂念,令备于小沛容身,实拜云天之德。今袁术欲报私仇,遣纪灵领兵到县,亡在旦夕,非将军莫能救。望驱一旅之师,以救倒悬之急,不胜幸甚!”吕布看了书,与陈宫计议曰:“前者袁术送粮致书,盖欲使我不救玄德也。今玄德又来求救。吾想玄德屯军小沛,未必遂能为我害;若袁术并了玄德,则北连泰山诸将以图我,我不能安枕矣:不若救玄德。”遂点兵起程。</p> <p> 却说纪灵起兵长驱大进,已到沛县东南,紥下营寨。昼列旌旗,遮映山川;夜设火鼓,震明天地。玄德县中,止有五千余人,也只得勉强出县,布阵安营。忽报吕布引兵离县一里、西南上紥下营寨。纪灵知吕布领兵来救刘备,急令人致书于吕布,责其无信。布笑曰:“我有一计,使袁、刘两家都不怨我。”乃发使往纪灵、刘备寨中,请二人饮宴。玄德闻布相请,即便欲往。关、张曰:“兄长不可去。吕布必有异心。”玄德曰:“我待彼不薄,彼必不害我。”遂上马而行。关、张随往,到吕布寨中,入见。布曰:“吾今特解公之危。异日得志,不可相忘!”玄德称谢。布请玄德坐。关、张按剑立于背后。人报纪灵到,玄德大惊,欲避之。布曰:“吾特请你二人来会议,勿得生疑。”玄德未知其意,心下不安。</p> <p> 纪灵下马入寨,却见玄德在帐上坐,大惊,抽身便回。左右留之不住。吕布向前一把扯回,如提童稚。灵曰:“将军欲杀纪灵耶?”布曰:“非也。”灵曰:“莫非杀大耳儿乎?”布曰:“亦非也。”灵曰:“然则为何?”布曰:“玄德与布乃兄弟也,今为将军所困,故来救之。”灵曰:“若此则杀灵也?”布曰:“无有此理。布平生不好斗,惟好解斗。吾今为两家解之。”灵曰:“请问解之之法?”布曰:“我有一法,从天所决。”乃拉灵入帐与玄德相见。二人各怀疑忌。布乃居中坐,使灵居左,备居右,且教设宴行酒。酒行数巡,布曰:“你两家看我面上,俱各罢兵。”玄德无语。灵曰:“吾奉主公之命,提十万之兵,专捉刘备,如何罢得?”张飞大怒,拔剑在手。叱曰:“吾虽兵少,觑汝辈如儿戏耳!你比百万黄巾如何?你敢伤我哥哥!”关公急止之曰:“且看吕将军如何主意,那时各回营寨厮杀未迟。”吕布曰:“我请你两家解斗,须不教你厮杀!”这边纪灵不忿,那边张飞只要厮杀。布大怒,教左右:“取我戟来,布提画戟在手,纪灵、玄德尽皆失色。布曰:“我劝你两家不要厮杀,尽在天命。”令左右接过画戟,去辕门外远远插定。乃回顾纪灵、玄德曰:“辕门离中军一百五十步,吾若一箭射中戟小枝,你两家罢兵,如射不中,你各自回营,安排厮杀。有不从吾言者,并力拒之。”纪灵私忖:“戟在一百五十步之外,安能便中?且落得应允。待其不中,那时凭我厮杀。”便一口许诺。玄德自无不允。布都教坐,再各饮一杯酒。酒毕,布教取弓箭来。玄德暗祝曰:“只愿他射得中便好!”只见吕布挽起袍袖,搭上箭,扯满弓,叫一声:“着!”正是:弓开如秋月行天,箭去似流星落地,一箭正中画戟小枝。帐上帐下将校,齐声喝采。后人有诗赞之曰:“温侯神射世间稀,曾向辕门独解危。落日果然欺后羿,号猿直欲胜由基。虎筋弦响弓开处,雕羽翎飞箭到时。豹子尾摇穿画戟,雄兵十万脱征衣。”</p> <p> 当下吕布射中画戟小枝,呵呵大笑,掷弓于地,执纪灵、玄德之手曰:“此天令你两家罢兵也!”喝教军士:“斟酒来!”各饮一大觥。”玄德暗称惭愧。纪灵默然半晌,告布曰:“将军之言,不敢不听;奈纪灵回去,主人如何肯信?”布曰:“吾自作书复之便了。”酒又数巡,纪灵求书先回。布谓玄德曰:“非我则公危矣。玄德拜谢,与关、张回。次日,三处军马都散。不说玄德入小沛,吕布归徐州。却说纪灵回淮南见袁术,说吕布辕门射戟解和之事,呈上书信。袁术大怒曰:“吕布受吾许多粮米,反以此儿戏之事,偏护刘备。吾当自提重兵,亲征刘备,兼讨吕布!”纪灵曰:“主公不可造次。吕布勇力过人,兼有徐州之地;若布与备首尾相连,不易图也。灵闻布妻严氏有一女,年已及笄。主公有一子,可令人求亲于布,布若嫁女于主公,必杀刘备:此乃疏不间亲之计也。”袁术从之,即日遣韩胤为媒,赍礼物往徐州求亲。</p> <p> 胤到徐州见布,称说:“主公仰慕将军,欲求令爱为儿妇,永结秦晋之好。”布入谋于妻严氏。原来吕布有二妻一妾:先娶严氏为正妻,后娶貂蝉为妾;及居小沛时,又娶曹豹之女为次妻。曹氏先亡无出,貂蝉亦无所出,惟严氏生一女,布最钟爱。当下严氏对布曰:“吾闻袁公路久镇淮南,兵多粮广,早晚将为天子。若成大事,则吾女有后妃之望。只不知他有几子?”布曰:“止有一子。”妻曰:“既如此,即当许之。纵不为皇后,吾徐州亦无忧矣。”布意遂决,厚款韩胤,许了亲事。韩胤回报袁术。术即备聘礼,仍令韩胤送至徐州。吕布受了、设席相待,留于馆驿安歇。</p> <p> 次日,陈宫竟往馆驿内拜望韩胤。讲礼毕,坐定。宫乃叱退左右,对胤曰:“谁献此计,教袁公与奉先联姻?意在取刘玄德之头乎?”胤失惊,起谢曰:“乞公台勿泄!”宫曰:“吾自不泄,只恐其事若迟,必被他人识破,事将中变。”胤曰:“然则奈何?”愿公教之。”宫曰:“吾见奉先,使其即日送女就亲,何如?”胤大喜,称谢曰:“若如此,袁公感佩明德不浅矣!”宫遂辞别韩胤。入见吕布曰:“闻公女许嫁袁公路,甚善。但不知于何日结亲?”布曰:“尚容徐议。”宫曰:“古者自受聘成婚之期,各有定例:天子一年,诸侯半年,大夫一季,庶民一月。”布曰:“袁公路天赐国宝,早晚当为帝,今从天子例,可乎?”宫曰:“不可。”布曰:“然则仍从诸侯例?”宫曰:“亦不可。”布曰:“然则将从卿大夫例矣?”宫曰:“亦不可。”布笑曰:“公岂欲吾依庶民例耶?”宫曰:“非也”。布曰:“然则公意欲如何?”宫曰:“方今天下诸侯,互相争雄;今公与袁公路结亲,诸侯保无有嫉妒者乎?”若复远择吉期,或竟乘我良辰,伏兵半路以夺之,如之奈何?为今之计:不许便休;既已许之。当趁诸侯未知之时,即便送女到寿春,另居别馆,然后择吉成亲,万无一失也。”布喜曰:“公台之言甚当。”遂入告严氏。连夜具办妆奁,收拾宝马香车,令宋宪、魏续一同韩胤送女前去。鼓乐喧天,送出城外。</p> <p> 时陈元龙之父陈珪,养老在家,闻鼓乐之声,遂问左右。左右告以故。珪曰:“此乃疏不间亲之计也。玄德危矣。”遂扶病来见吕布。布曰:“大夫何来?”珪曰:“闻将军死至,特来吊丧。”布惊曰:“何出此言?”珪曰:“前者袁公路以金帛送公,欲杀刘玄德,而公以射戟解之;今忽来求亲,其意盖欲以公女为质,随后就来攻玄德而取小沛。小沛亡,徐州危矣。且彼或来借粮,或来借兵:公若应之,是疲于奔命,而又结怨于人;若其不允,是弃亲而启兵端也。况闻袁术有称帝之意,是造反也。彼若造反,则公乃反贼亲属矣,得无为天下所不容乎?”布大惊曰:“陈宫误我!”急命张辽引兵,追赶至三十里之外,将女抢归;连韩胤都拿回监禁,不放归去。却令人回复袁术,只说女儿妆奁未备,俟备毕便自送来。陈珪又说吕布,使解韩胤赴许都。布犹豫未决。</p> <p> 忽人报:“玄德在小沛招军买马,不知何意。”布曰:“此为将者本分事,何足为怪。”正话间,宋宪、魏续至,告布曰:“我二人奉明公之命,往山东买马,买得好马三百余匹;回至沛县界首,被强寇劫去一半。打听得是刘备之弟张飞,诈妆出贼,抢劫马匹去了。”吕布听了大怒,随即点兵往小沛来斗张飞。玄德闻知大惊,慌忙领兵出迎。两阵圆处,玄德出马曰:“兄长何故领兵到此?”布指骂曰:“我辕门射戟,救你大难,你何故夺我马匹?”玄德曰:“备因缺马,令人四下收买,安敢夺兄马匹。”布曰:你便使张飞夺了我好马一百五十匹,尚自抵赖!”张飞挺枪出马曰:“是我夺了你好马!你今待怎么?”布骂曰:“环眼贼!你累次渺视我!”飞曰:“我夺你马你便恼,你夺我哥哥的徐州便不说了!”布挺戟出马来战张飞,飞亦挺枪来迎。两个酣战一百余合,未见胜负。玄德恐有疏失,急鸣金收军入城。吕布分军四面围定。玄德唤张飞责之曰:“都是你夺他马匹,惹起事端!如今马匹在何处?”飞曰:“都寄在各寺院内。”玄德随令人出城,至吕布营中,说情愿送还马匹,两相罢兵。布欲从之。陈宫曰:“今不杀刘备,久后必为所害。”布听之,不从所请,攻城愈急。玄德与糜竺、孙乾商议。孙乾曰:“曹操所恨者,吕布也。不若弃城走许都,投奔曹操,借军破布,此为上策。”玄德曰:“谁可当先破围而出?”飞曰:“小弟情愿死战!”玄德令飞在前,云长在后;自居于中,保护老小。当夜三更,乘着月明,出北门而走。正遇宋宪、魏续,被翼德一阵杀退,得出重围。后面张辽赶来,关公敌住。吕布见玄德去了,也不来赶,随即入城安民,令高顺守小沛,自己仍回徐州去了。</p> <p> 却说玄德前奔许都,到城外下寨,先使孙乾来见曹操,言被吕布追逼。特来相投。操曰:“玄德与吾,兄弟也。”便请入城相见。次日,玄德留关、张在城外,自带孙乾、糜竺入见操。操待以上宾之礼。玄德备诉吕布之事,操曰:“布乃无义之辈,吾与贤弟并力诛之。”玄德称谢。操设宴相待,至晚送出。荀彧入见曰:“刘备,英雄也。今不早图,后必为患。”操不答。彧出,郭嘉入。操曰:“荀彧劝我杀玄德,当如何?”嘉曰:“不可。主公兴义兵,为百姓除暴,惟仗信义以招俊杰,犹惧其不来也;今玄德素有英雄之名,以困穷而来投,若杀之,是害贤也。天下智谋之士,闻而自疑,将裹足不前,主公谁与定天下乎?夫除一人之患,以阻四海之望:安危之机不可不察。”操大喜曰:“君言正合吾心。”次日,即表荐刘备领豫州牧。程昱谏曰:“刘备终不为人之下,不如早图之。”操曰:“方今正用英雄之时,不可杀一人而失天下之心。此郭奉孝与吾有同见也。”遂不听昱言,以兵三千、粮万斛送与玄德,使往豫州到任。进兵屯小沛,招集原散之兵,攻吕布。玄德至豫州,令人约会曹操。操正欲起兵,自往征吕布,忽流星马报说张济自关中引兵攻南阳,为流矢所中而死;济侄张绣统其众,用贾诩为谋士,结连刘表,屯兵宛城,欲兴兵犯阙夺驾。操大怒,欲兴兵讨之,又恐吕布来侵许都,乃问计于荀彧。彧曰:“此易事耳。吕布无谋之辈,见利必喜;明公可遣使往徐州,加官赐赏,令与玄德解和。布喜,则不思远图矣。”操曰:“善。”遂差奉军都尉王则,赍官诰并和解书,往徐州去讫。一面起兵十五万,亲讨张绣。分军三路而行,以夏侯惇为先锋。军马至淯水下寨。贾诩劝张绣曰:“操兵势大,不可与敌,不如举众投降。”张绣从之,使贾诩至操寨通款。操见诩应对如流,甚爱之,效用为谋士。诩曰:“某昔从李傕,得罪天下;今从张绣,言听计从,不忍弃之。”乃辞去。次日引绣来见操,操待之甚厚。引兵入宛城屯紥,余军分屯城外,寨栅联络十余里。一住数日,绣每日设宴请操。</p> <p> 一日操醉,退入寝所,私问左右曰:“此城中有妓女否?”操之兄子曹安民,知操意,乃密对曰:“昨晚小侄窥见馆舍之侧,有一妇人,生得十分美丽,问之,即绣叔张济之妻也。”操闻言,便令安民领五十甲兵往取之。须臾,取到军中。操见之,果然美丽。问其姓,妇答曰:“妾乃张济之妻邹氏也。”操曰:“夫人识吾否?”邹氏曰:“久闻丞相威名,今夕幸得瞻拜。”操曰:“吾为夫人故,特纳张绣之降;不然灭族矣。”邹氏拜曰:“实感再生之恩。”操曰:“今日得见夫人,乃天幸也。今宵愿同枕席,随吾还都,安享富贵,何如?”邹氏拜谢。是夜,共宿于帐中。邹氏曰:“久住城中,绣必生疑,亦恐外人议论。”操曰:“明日同夫人去寨中住。”次日,移于城外安歇,唤典韦就中军帐房外宿卫。他人非奉呼唤,不许辄入。因此,内外不通。操每日与邹氏取乐,不想归期。</p> <p> 张绣家人密报绣。绣怒曰:“操贼辱我太甚!”便请贾诩商议。诩曰:“此事不可泄漏。来日等操出帐议事,如此如此。”次日,操坐帐中,张绣入告曰:“新降兵多有逃亡者,乞移屯中军。”操许之。绣乃移屯其军。分为四寨,刻期举事。因畏典韦勇猛,急切难近,乃与偏将胡车儿商议。那胡车儿力能负五百斤,日行七百里,亦异人也。当下献计于绣曰:“典韦之可畏者,双铁戟耳。主公明日可请他来吃酒,使尽醉而归。那时某便混入他跟来军士数内,偷入帐房,先盗其戟,此人不足畏矣。”绣甚喜,预先准备弓箭、甲兵,告示各寨。至期,令贾诩致意请典韦到寨,殷勤待酒。至晚醉归,胡车儿杂在众人队里,直入大寨。是夜曹操于帐中与邹氏饮酒,忽听帐外人言马嘶。操使人观之。回报是张绣军夜巡,操乃不疑。时近二更,忽闻寨内呐喊,报说草车上火起。操曰:“军人失火,勿得惊动。”须臾,四下里火起。操始着忙,急唤典韦。韦方醉卧,睡梦中听得金鼓喊杀之声,便跳起身来,却寻不见了双戟。时敌兵已到辕门,韦急掣步卒腰刀在手。只见门首无数军马,各挺长枪,抢入寨来。韦奋力向前,砍死二十余人。马军方退,步军又到,两边枪如苇列。韦身无片甲,上下被数十枪,兀自死战。刀砍缺不堪用,韦即弃刀,双手提着两个军人迎敌,击死者八九人,群贼不敢近,只远远以箭射之,箭如骤雨。韦犹死拒寨门。怎奈寨后贼军已入,韦背上又中一枪,乃大叫数声,血流满地而死。死了半晌,还无一人敢从前门而入者。</p> <p> 却说曹操赖典韦当住寨门,乃得从寨后上马逃奔,只有曹安民步随。操右臂中了一箭,马亦中了三箭。亏得那马是大宛良马,熬得痛,走得快。刚刚走到淯水河边,贼兵追至,安民被砍为肉泥。操急骤马冲波过河,才上得岸,贼兵一箭射来,正中马眼,那马扑地倒了。操长子曹昂,即以己所乘之马奉操。操上马急奔。曹昂却被乱箭射死。操乃走脱。路逢诸将,收集残兵。时夏侯惇所领青州之兵,乘势下乡,劫掠民家,平虏校尉于禁,即将本部军于路剿杀,安抚乡民。青州兵走回,迎操泣拜于地,言于禁造反,赶杀青州军马。操大惊。须臾,夏侯惇、许褚、李典;乐进都到。操言于禁造反,可整兵迎之,却说于禁见操等俱到,乃引军射住阵角,凿堑安营。或告之曰:“青州军言将军造反,今丞相已到,何不分辩,乃先立营寨耶?”于禁曰:“今贼追兵在后,不时即至;若不先准备,何以拒敌?分辩小事,退敌大事。”</p> <p> 安营方毕,张绣军两路杀至。于禁身先出寨迎敌。绣急退兵。左右诸将,见于禁向前,各引兵击之,绣军大败,追杀百余里。绣势穷力孤,引败兵投刘表去了。曹操收军点将,于禁入见,备言青州之兵,肆行劫掠,大失民望,某故杀之。操曰:“不告我,先下寨,何也?”禁以前言对。操曰:“将军在匆忙之中,能整兵坚垒,任谤任劳,使反败为胜,虽古之名将,何以加兹!”乃赐以金器一副,封益寿亭侯;责夏侯惇治兵不严之过。又设祭祭典韦,操亲自哭而奠之,顾谓诸将曰:“吾折长子、爱侄,俱无深痛;独号泣典韦也!”众皆感叹,次日下令班师。不说曹操还兵许都。且说王则赍诏至徐州,布迎接入府,开读诏书:封布为平东将军,特赐印绶。又出操私书,王则在吕布面前极道曹公相敬之意。布大喜。忽报袁术遣人至,布唤入问之。使言:“袁公早晚即皇帝位,立东宫,催取皇妃早到淮南。”布大怒曰:“反贼焉敢如此!”遂杀来使,将韩胤用枷钉了,遣陈登赍谢表,解韩胤一同王则上许都来谢恩。且答书于操,欲求实授徐州牧。操知布绝婚袁术,大喜,遂斩韩胤于市曹。陈登密谏操曰:“吕布,豺狼也,勇而无谋,轻于去就,宜早图之。”操曰:“吾素知吕布狼子野心,诚难久养。非公父子莫能究其情,公当与吾谋之。”登曰:“丞相若有举动,某当为内应。”操喜,表赠陈珪秩中二千石,登为广陵太守。登辞回,操执登手曰:“东方之事,便以相付。”登点头允诺。回徐州见吕布,布问之,登言:“父赠禄,某为太守。”布大怒曰:“汝不为吾求徐州牧,而乃自求爵禄!汝父教我协同曹公,绝婚公路,今吾所求,终无一获;而汝父子俱各显贵,吾为汝父子所卖耳!”遂拔剑欲斩之。登大笑曰:“将军何其不明之甚也!”布曰:“吾何不明?”登曰:“吾见曹公,言养将军譬如养虎,当饱其肉,不饱则将噬人。曹公笑曰:“不如卿言。吾待温侯,如养鹰耳:狐兔未息,不敢先饱,饥则为用,饱则飏去。某问谁为狐兔,曹公曰:“淮南袁术;江东孙策、冀州袁绍、荆襄刘表、益州刘璋、汉中张鲁,皆狐兔也。布掷剑笑曰:“曹公知我也!”正说话间,忽报袁术军取徐州。吕布闻言失惊。正是:秦晋未谐吴越斗,婚姻惹出甲兵来。</p> <p> 毕竟后事如何,且听下文分解。</p> </p> </div> '''
xpath 解析
一、xpath的使用
1、安装环境
pip install xpath
2、解析原理
- 获取页面源码数据
- 实例化一个etree的对象,并且将页面源码数据加载到该对象中
- 调用该对象的xpath方法进行指定标签的定位
- 注意:xpath函数必须结合着xpath表达式进行标签定位和内容捕获
3、xpath表达式
4、xpath插件
插件的使用:
在谷歌浏览器中,右上角->更多工具->扩展工具->打开开发者模式->然后将该插件拖进浏览器中即可,确认添加扩展程序。
重新打开浏览器:
shift + ctrl + x 打开xpath 的插件,可以写xpath表达式,验证是否正确。
二、简单的使用示例(解析58二手房相关数据)
示例1:解析58二手房的相关数据
#项目需求:解析58二手房的相关数据 import requests from lxml import etree url = 'https://bj.58.com/ershoufang/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT&PGTID=0d100000-0000-1df3-7610-671fd7a25892&ClickID=2' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36' } page_text = requests.get(url=url,headers=headers).text tree = etree.HTML(page_text) li_list = tree.xpath('//ul[@class="house-list-wrap"]/li') #返回的是列表 f = open("./58fangjia.txt",'w',encoding="utf-8") for li in li_list: title = li.xpath('./div[2]/h2/a/text()')[0] price = li.xpath('./div[3]//text()') price = ''.join(price) f.write(title+":"+price+"\n") f.close() print("over...")
三、中文出现乱码(解析图片数据)
示例2:解析图片数据:http://pic.netbian.com/4kfengjing/
中文出现乱码的原因,可能是因为网页中html 使用的是 gbk 的编码方式。
解决有两种方式如下:
#出现中文乱码 # - 解析图片数据:http://pic.netbian.com/4kfengjing/ #首先判断图片是否为动态加载 network 中判断查找 该网页不是动态加载 import requests from lxml import etree import os import urllib url = 'http://pic.netbian.com/4kfengjing/' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36' } if not os.path.exists("./img"): os.mkdir("./img") page_text = requests.get(url=url,headers=headers).text # page_text.encoding="utf-8" #第一种解决乱码的问题,如果不行就采用下面的第二种 tree = etree.HTML(page_text) a_list = tree.xpath('//ul[@class="clearfix"]/li/a') for a in a_list: img_title = a.xpath('./b/text()')[0] img_title = img_title.encode('iso-8859-1').decode('gbk') #第二种解决乱码的问题 img_url = 'http://pic.netbian.com'+a.xpath('./img/@src')[0] img_path = "./img/" + img_title + ".jpg" urllib.request.urlretrieve(url=img_url,filename=img_path) print(img_title,"下载完成!") print("over...")
四、数据加密(反爬机制)(爬取煎蛋网中的图片数据!!!)
示例3:【重点】下载煎蛋网中的图片数据:http://jandan.net/ooxx
数据加密(反爬机制)
下载的图片中,img 标签中的 src 中的 url 是动态获取的,需要仔细分析 html。
#【重点】下载煎蛋网中的图片数据:http://jandan.net/ooxx import requests from lxml import etree import base64 import os import urllib url = 'http://jandan.net/ooxx' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36' } if not os.path.exists("./img2"): os.mkdir("./img2") res = requests.get(url=url,headers=headers).text tree = etree.HTML(res) img_hash_list = tree.xpath('//span[@class="img-hash"]/text()') #获取加密的密文,列表 for img_hash in img_hash_list: img_url = 'http:'+base64.b64decode(img_hash).decode() #通过分析网页中,发现是base64加密,所以要采用base64解密 img_path = "./img2/"+img_url.split("/")[-1] urllib.request.urlretrieve(url=img_url,filename=img_path) print(img_path,"下载完成!") print("over...")
五、多页内容的url规律不同的情况下,需要分类处理(爬取简历模板)
示例4: 爬取站长素材中的简历模板
第一页和其他页码的 url 不一样,需要分别处理如下;
另外下载简历,可以通过电信下载、联通下载......等等非常多的情况下都能下载到的话,可以将多个请求的url放到列表中,然后随机抽取,进行访问下载,这样可以避免由于访问频率过高被限制。
#爬取站长素材中的简历模板 import requests import random from lxml import etree headers = { 'Connection':'close', #当请求成功后,马上断开该次请求(及时释放请求池中的资源) 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36' } url = 'http://sc.chinaz.com/jianli/free_%d.html' #url第一页和第二页不一样,爬取多页的时候要做处理 for page in range(1,4): if page == 1: new_url = 'http://sc.chinaz.com/jianli/free.html' #处理 else: new_url = format(url%page) #处理 response = requests.get(url=new_url,headers=headers) response.encoding = 'utf-8' #解决乱码 page_text = response.text tree = etree.HTML(page_text) div_list = tree.xpath('//div[@id="container"]/div') for div in div_list: detail_url = div.xpath('./a/@href')[0] name = div.xpath('./a/img/@alt')[0] detail_page = requests.get(url=detail_url,headers=headers).text tree = etree.HTML(detail_page) download_list = tree.xpath('//div[@class="clearfix mt20 downlist"]/ul/li/a/@href') download_url = random.choice(download_list) #下载的请求url,最好是随机获取,防止请求频繁,被禁止 data = requests.get(url=download_url,headers=headers).content fileName = name+'.rar' with open(fileName,'wb') as fp: fp.write(data) print(fileName,'下载成功'
六、HTTPConnectionPool 错误(大量发送请求导致)(解析城市的名称)
示例5:解析城市的名称
由于城市较多,
#解析所有的城市名称 import requests from lxml import etree headers = { 'Connection':'close', #当请求成功后,马上断开该次请求(及时释放请求池中的资源) 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36' } url = 'https://www.aqistudy.cn/historydata/' page_text = requests.get(url=url,headers=headers).text tree = etree.HTML(page_text) li_list = tree.xpath('//div[@class="bottom"]/ul/li | //div[@class="bottom"]/ul/div[2]/li') #由于有热门城市,有主城市,可以写两个 xpath 表达式,返回的是只要符合其中一个就能返回 for li in li_list: city_name = li.xpath('./a/text()')[0] print(city_name)
注意:如果报一下错误,可能是由于大量访问导致的,在headers中添加键值对, 'Connection':'close', 即可
七、图片的懒加载
图片懒加载也是一种反爬机制
图片的懒加载是,刷新网页的时候, 图片不是动态加载的,但是可视化区域中 img 标签中的属性是src,,而非可视化区域中的 img 标签的属性是 src2(也有可能是其他的名称)。
针对这种情况,在爬取图片的时候,获取url 时,直接使用非可视化区域中 img 中的src2即可。
八、代理ip
#设置请求的代理ip: www.goubanjia.com 快代理 西祠代理
#代理ip的类型必须和请求url的协议头保持一致 url = 'https://www.baidu.com/s?wd=ip' page_text = requests.get(url=url,headers=headers,proxies={'https':'61.7.170.240:8080'}).text with open('./ip.html','w',encoding='utf-8') as fp: fp.write(page_text)
九、反爬机制的总结
robots # 可以遵循可以不遵循
UA # User-Agent
数据加密 # 分析加密方式
懒加载 # 使用非可视化区域的 src名称
代理 ip # 发送请求时添加 proxies