VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > 简明python教程 >
  • Python爬虫:设置Cookie解决网站拦截并爬取蚂蚁短租

前言

文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者: Eastmount

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef

我们在编写Python爬虫时,有时会遇到网站拒绝访问等反爬手段,比如这么我们想爬取蚂蚁短租数据,它则会提示“当前访问疑似黑客攻击,已被网站管理员设置为拦截”提示,如下图所示。此时我们需要采用设置Cookie来进行爬取,下面我们进行详细介绍。非常感谢我的学生承峰提供的思想,后浪推前浪啊!

一. 网站分析与爬虫拦截

当我们打开蚂蚁短租搜索贵阳市,反馈如下图所示结果。 在这里插入图片描述 我们可以看到短租房信息呈现一定规律分布,如下图所示,这也是我们要爬取的信息。 在这里插入图片描述

通过浏览器审查元素,我们可以看到需要爬取每条租房信息都位于<dd></dd>节点下。 在这里插入图片描述 在定位房屋名称,如下图所示,位于<div class="room-detail clearfloat"></div>节点下。 在这里插入图片描述

接下来我们写个简单的BeautifulSoup进行爬取。

复制代码
 1 # -*- coding: utf-8 -*-
 2 import urllib
 3 import re 
 4 from bs4 import BeautifulSoup
 5 import codecs
 6  
 7 url = 'http://www.mayi.com/guiyang/?map=no'
 8 response=urllib.urlopen(url)
 9 contents = response.read()
10 soup = BeautifulSoup(contents, "html.parser")
11 print soup.title
12 print soup
13 #短租房名称
14 for tag in soup.find_all('dd'):
15     for name in tag.find_all(attrs={"class":"room-detail clearfloat"}):
16         fname = name.find('p').get_text()
17         print u'[短租房名称]', fname.replace('\n','').strip()
复制代码

 

但很遗憾,报错了,说明蚂蚁金服防范措施还是挺到位的。 在这里插入图片描述

二. 设置Cookie的BeautifulSoup爬虫

添加消息头的代码如下所示,这里先给出代码和结果,再教大家如何获取Cookie。

复制代码
 1 # -*- coding: utf-8 -*-
 2 import urllib2
 3 import re 
 4 from bs4 import BeautifulSoup
 5  
 6  
 7 #爬虫函数
 8 def gydzf(url):
 9     user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
10     headers={"User-Agent":user_agent}
11     request=urllib2.Request(url,headers=headers)
12     response=urllib2.urlopen(request)
13     contents = response.read() 
14     soup = BeautifulSoup(contents, "html.parser")
15     for tag in soup.find_all('dd'):
16         #短租房名称
17         for name in tag.find_all(attrs={"class":"room-detail clearfloat"}):
18             fname = name.find('p').get_text()
19             print u'[短租房名称]', fname.replace('\n','').strip()
20         #短租房价格
21         for price in tag.find_all(attrs={"class":"moy-b"}):
22             string = price.find('p').get_text()
23             fprice = re.sub("[¥]+".decode("utf8"), "".decode("utf8"),string)
24             fprice = fprice[0:5]
25             print u'[短租房价格]', fprice.replace('\n','').strip()
26             #评分及评论人数
27             for score in name.find('ul'):
28                 fscore = name.find('ul').get_text()
29             print u'[短租房评分/评论/居住人数]', fscore.replace('\n','').strip()           
30             #网页链接url           
31             url_dzf = tag.find(attrs={"target":"_blank"})
32             urls = url_dzf.attrs['href']
33             print u'[网页链接]', urls.replace('\n','').strip()
34             urlss = 'http://www.mayi.com' + urls + ''
35             print urlss
36  
37 #主函数
38 if __name__ == '__main__':
39     i = 1
40     while i<10:
41         print u'页码', i
42         url = 'http://www.mayi.com/guiyang/' + str(i) + '/?map=no'
43         gydzf(url)
44         i = i+1
45     else:
46         print u"结束"
复制代码

 

输出结果如下图所示:

复制代码
 1 页码 1
 2 [短租房名称] 大唐东原财富广场--城市简约复式民宿
 3 [短租房价格] 298
 4 [短租房评分/评论/居住人数] 5.0分·5条评论·二居·可住3人
 5 [网页链接] /room/851634765
 6 http://www.mayi.com/room/851634765
 7 [短租房名称] 大唐东原财富广场--清新柠檬复式民宿
 8 [短租房价格] 568
 9 [短租房评分/评论/居住人数] 2条评论·三居·可住6人
10 [网页链接] /room/851634467
11 http://www.mayi.com/room/851634467
12  
13 ...
14  
15 页码 9
16 [短租房名称] 【高铁北站公园旁】美式风情+超大舒适安逸
17 [短租房价格] 366
18 [短租房评分/评论/居住人数] 3条评论·二居·可住5人
19 [网页链接] /room/851018852
20 http://www.mayi.com/room/851018852
21 [短租房名称] 大营坡(中大国际购物中心附近)北欧小清新三室
22 [短租房价格] 298
23 [短租房评分/评论/居住人数] 三居·可住6人
24 [网页链接] /room/851647045
25 http://www.mayi.com/room/851647045
 


相关教程