本文共 4968 字,大约阅读时间需要 16 分钟。
前面学习了基本的浏览器伪装的方式,现在来看三个实例:
例1 爬取CSDN首页的博文
思路很简单,伪装浏览器之后,通过正则获取对应的url链接,然后把对应的url的文章都下载下来#!/usr/bin/env python#! -*- coding:utf-8 -*-# Author: Yuan Liimport re,urllib.requesturl="http://blog.csdn.net/"header=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36")opener=urllib.request.build_opener()opener.addheaders=[header]data=opener.open(url).read().decode('UTF-8')print(data)pat='
结果如下
例2 爬取糗事百科的段子
这个比起第一个例子来说,稍微复杂了一点点。
首先呢,我们需要爬取前面35页的段子,需要分析url的格式,每次翻页爬取的时候,都需要伪装浏览器,因此需要把伪装的User-Agent设置为全局的模式;
第二点,我们在正则匹配的时候使用了模式修饰符re.S。这是为什么呢,因为一个段子有很多行,默认情况下,小圆点只会匹配除了换行以外的所有符号,我们可以强制要求他匹配所有的符号包括换行符
具体的说明可以参考官方文档
import urllib.requestimport reheaders=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0")opener=urllib.request.build_opener()opener.addheaders=[headers]#安装为全局urllib.request.install_opener(opener)for i in range(0,35): thisurl="http://www.qiushibaike.com/8hr/page/"+str(i+1)+"/?s=4948859" data=urllib.request.urlopen(thisurl).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("-------")
结果如下:
早晨去吃牛肉面,正在吃~~~~<br/>来了一位美女。<br/>老板,来碗牛肉面,<br/>大碗小碗的?<br/>早晨刚起床,大份(大粪)吃不下,来小份(小粪)的吧<br/>对面坐的大哥,你的面条怎么从鼻孔里出来了???
接上一条,不能一次发两张图郁闷
在食堂买饭,要了咖喱猪排饭。有个男生要了咖喱牛肉饭。<br/>一会饭熟了,阿姨说:咖喱牛好了。<br/>对我说:咖喱猪等一会
这地铁工艺广告看着不对劲啊!脖子有点脱节!这手也是特别畸形!P上去的吧!?
楼主是个敏感的人,读书时,经常因别人一句话不顺耳,就跟人家打架,树敌颇多,奈何我身强力壮,倒也没输过。<br/>有天放学回家的路上,突然出现几个大孩子拦着我,我一瞅,这,人多势众,不能吃眼前亏,忽然看到我妹妹走过来,赶紧喊:“二妹,快过来帮忙,她们人多!”<br/>我妹瞅着我们,结结巴巴的说:“我,我,我不认识她,我不是她妹妹,”说完风一样的跑了……<br/>二十几年了……现在你说你要结婚,问我送你什么礼物??<br/>送你赶快滚!
偷过人的朋友举手,不管男人女人,举手看看有多少。
有个妹纸发信息到我手机上说这个号码是她以前用的。现在无聊就打打玩玩,结果聊的特别嗨。慢慢的没怎么联系了。<br/>一晃5 6 年过去了。<br/>忽然今天想起这事。打电话到我以前的号码。居然联系上了。 我擦。(最巧的是我和那个妹子是同年同月同日的)<br/>不过5、6年了。她也结婚生子了。祝她幸福。对了今天我生日。生日快乐。周小洵。
因为孩子,和公婆住过一段时间。<br/>我对他们越好,他们事越多。比如,给他们买衣服,他们说我乱花钱。对他们好一点,他们觉得我无事献殷勤,想图谋他们财产。。。。。后来矛盾越来越多。<br/>到了后来,我婆婆直接对我说:滚!<br/><br/>后来,我就辞职了,带上钱去了远处,另外找工作。<br/>可我还在路上,车上,我婆婆就打电话给我老公,叫我回去。还说,如果我不喜欢原来的工作,可以给我另外找工作。让我别走。<br/>我愣了,实在不明白为什么?<br/>是觉得我好么?<br/>那为何说那么难听的话?<br/>是觉得我不好吗?<br/>那为啥说,滚?<br/>也许是因为我走了,他们自
…我们是来跳广场舞的!哈哈
好长时间没给儿子买汉堡了,今天德克士会员日买一送一。和老公去吃,回来帮他带了一个,儿子放学回家告诉他有汉堡,他竟然说,今个太阳从西边出来了,不过说话时有着莫名的喜感
这都没人吃到。。?
例3 用户代理池的构建
这个在例2的基础上构建了一个列表,列表里面是多个User-Agent的内容,每次爬取的时候随机的获取一个User-Agent,这样对于网站而言,看起来好像是同一个IP地址不同的浏览器发出的请求,可以更好地实现反爬的效果。
知识点: random.choice可以随机地从列表选取一个内容
import urllib.requestimport reimport randomuapools=[ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)", ]def ua(uapools): thisua=random.choice(uapools) print(thisua) headers=("User-Agent",thisua) opener=urllib.request.build_opener() opener.addheaders=[headers] #安装为全局 urllib.request.install_opener(opener)for i in range(0,35): ua(uapools) thisurl="http://www.qiushibaike.com/8hr/page/"+str(i+1)+"/?s=4948859" data=urllib.request.urlopen(thisurl).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("-------")
例4 最后来看看如何根据关键字来爬取淘宝的图片
这个思路和前面的例子其实没啥区别,主要难点有两个:
#!/usr/bin/env python#! -*- coding:utf-8 -*-# Author: Yuan Liimport urllib.requestimport reimport randomkeyname = "椰奶"#处理中文key = urllib.request.quote(keyname)uapools = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",]def ua(uapools): thisua = random.choice(uapools) print(thisua) headers = ("User-Agent", thisua) opener = urllib.request.build_opener() opener.addheaders = [headers] # 安装为全局 urllib.request.install_opener(opener)for i in range(1, 101): url = "https://s.taobao.com/search?q=" + key + "&s=" + str((i - 1) * 44) ua(uapools) data = urllib.request.urlopen(url).read().decode("utf-8", "ignore") pat = '"pic_url":"//(.*?)"' imglist = re.compile(pat).findall(data) for j in range(0, len(imglist)): thisimg = imglist[j] thisimgurl = "http://" + thisimg localfile = "c:\\temp\\taobao\\" + str(i) + str(j) + ".jpg" urllib.request.urlretrieve(thisimgurl, filename=localfile)