Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题


Posted in Python onFebruary 22, 2021

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

一. 网站分析与爬虫拦截

当我们打开蚂蚁短租搜索贵阳市,反馈如下图所示结果。

Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题

我们可以看到短租房信息呈现一定规律分布,如下图所示,这也是我们要爬取的信息。

Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题

通过浏览器审查元素,我们可以看到需要爬取每条租房信息都位于<dd></dd>节点下。

Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:810735403

在定位房屋名称,如下图所示,位于<div class="room-detail clearfloat"></div>节点下。

Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题

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

# -*- coding: utf-8 -*-
import urllib
import re
from bs4 import BeautifulSoup
import codecs
 
url = 'http://www.mayi.com/guiyang/?map=no'
response=urllib.urlopen(url)
contents = response.read()
soup = BeautifulSoup(contents, "html.parser")
print soup.title
print soup
#短租房名称
for tag in soup.find_all('dd'):
 for name in tag.find_all(attrs={"class":"room-detail clearfloat"}):
 fname = name.find('p').get_text()
 print u'[短租房名称]', fname.replace('\n','').strip()

但很遗憾,报错了,说明蚂蚁金服防范措施还是挺到位的。

Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题

二. 设置Cookie的BeautifulSoup爬虫

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

# -*- coding: utf-8 -*-
import urllib2
import re
from bs4 import BeautifulSoup
 
#爬虫函数
def gydzf(url):
 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"
 headers={"User-Agent":user_agent}
 request=urllib2.Request(url,headers=headers)
 response=urllib2.urlopen(request)
 contents = response.read()
 soup = BeautifulSoup(contents, "html.parser")
 for tag in soup.find_all('dd'):
 #短租房名称
 for name in tag.find_all(attrs={"class":"room-detail clearfloat"}):
 fname = name.find('p').get_text()
 print u'[短租房名称]', fname.replace('\n','').strip()
 #短租房价格
 for price in tag.find_all(attrs={"class":"moy-b"}):
 string = price.find('p').get_text()
 fprice = re.sub("[¥]+".decode("utf8"), "".decode("utf8"),string)
 fprice = fprice[0:5]
 print u'[短租房价格]', fprice.replace('\n','').strip()
 #评分及评论人数
 for score in name.find('ul'):
 fscore = name.find('ul').get_text()
 print u'[短租房评分/评论/居住人数]', fscore.replace('\n','').strip()
 #网页链接url
 url_dzf = tag.find(attrs={"target":"_blank"})
 urls = url_dzf.attrs['href']
 print u'[网页链接]', urls.replace('\n','').strip()
 urlss = 'http://www.mayi.com' + urls + ''
 print urlss
 
#主函数
if __name__ == '__main__':
 i = 1
 while i<10:
 print u'页码', i
 url = 'http://www.mayi.com/guiyang/' + str(i) + '/?map=no'
 gydzf(url)
 i = i+1
 else:
 print u"结束"

输出结果如下图所示:

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

Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题

接下来我们想获取详细信息

Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题

这里作者主要是提供分析Cookie的方法,使用浏览器打开网页,右键“检查”,然后再刷新网页。在“NetWork”中找到网页并点击,在弹出来的Headers中就隐藏这这些信息。

Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题

最常见的两个参数是Cookie和User-Agent,如下图所示:

Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题

然后在Python代码中设置这些参数,再调用Urllib2.Request()提交请求即可,核心代码如下:

user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/61.0.3163.100 Safari/537.36"
 cookie="mediav=%7B%22eid%22%3A%22387123...b3574ef2-21b9-11e8-b39c-1bc4029c43b8"
 headers={"User-Agent":user_agent,"Cookie":cookie}
 request=urllib2.Request(url,headers=headers)
 response=urllib2.urlopen(request)
 contents = response.read()
 soup = BeautifulSoup(contents, "html.parser")
 for tag1 in soup.find_all(attrs={"class":"main"}):

注意,每小时Cookie会更新一次,我们需要手动修改Cookie值即可,就是上面代码的cookie变量和user_agent变量。完整代码如下所示:

import urllib2
import re
from bs4 import BeautifulSoup
import codecs
import csv
 
c = open("ycf.csv","wb") #write 写
c.write(codecs.BOM_UTF8)
writer = csv.writer(c)
writer.writerow(["短租房名称","地址","价格","评分","可住人数","人均价格"])
 
#爬取详细信息
def getInfo(url,fname,fprice,fscore,users):
 #通过浏览器开发者模式查看访问使用的user_agent及cookie设置访问头(headers)避免反爬虫,且每隔一段时间运行要根据开发者中的cookie更改代码中的cookie
 user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
 cookie="mediav=%7B%22eid%22%3A%22387123%22eb7; mayi_uuid=1582009990674274976491; sid=42200298656434922.85.130.130"
 headers={"User-Agent":user_agent,"Cookie":cookie}
 request=urllib2.Request(url,headers=headers)
 response=urllib2.urlopen(request)
 contents = response.read()
 soup = BeautifulSoup(contents, "html.parser")
 #短租房地址
 for tag1 in soup.find_all(attrs={"class":"main"}):
 print u'短租房地址:'
 for tag2 in tag1.find_all(attrs={"class":"desWord"}):
 address = tag2.find('p').get_text()
 print address
 #可住人数
 print u'可住人数:'
 for tag4 in tag1.find_all(attrs={"class":"w258"}):
 yy = tag4.find('span').get_text()
 print yy
 fname = fname.encode("utf-8")
 address = address.encode("utf-8")
 fprice = fprice.encode("utf-8")
 fscore = fscore.encode("utf-8")
 fpeople = yy[2:3].encode("utf-8")
 ones = int(float(fprice))/int(float(fpeople))
 #存储至本地
 writer.writerow([fname,address,fprice,fscore,fpeople,ones])
 
#爬虫函数
def gydzf(url):
 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"
 headers={"User-Agent":user_agent}
 request=urllib2.Request(url,headers=headers)
 response=urllib2.urlopen(request)
 contents = response.read()
 soup = BeautifulSoup(contents, "html.parser")
 for tag in soup.find_all('dd'):
 #短租房名称
 for name in tag.find_all(attrs={"class":"room-detail clearfloat"}):
 fname = name.find('p').get_text()
 print u'[短租房名称]', fname.replace('\n','').strip()
 #短租房价格
 for price in tag.find_all(attrs={"class":"moy-b"}):
 string = price.find('p').get_text()
 fprice = re.sub("[¥]+".decode("utf8"), "".decode("utf8"),string)
 fprice = fprice[0:5]
 print u'[短租房价格]', fprice.replace('\n','').strip()
 #评分及评论人数
 for score in name.find('ul'):
 fscore = name.find('ul').get_text()
 print u'[短租房评分/评论/居住人数]', fscore.replace('\n','').strip()
 #网页链接url
 url_dzf = tag.find(attrs={"target":"_blank"})
 urls = url_dzf.attrs['href']
 print u'[网页链接]', urls.replace('\n','').strip()
 urlss = 'http://www.mayi.com' + urls + ''
 print urlss
 getInfo(urlss,fname,fprice,fscore,user_agent)
 
#主函数
if __name__ == '__main__':
 i = 0
 while i<33:
 print u'页码', (i+1)
 if(i==0):
 url = 'http://www.mayi.com/guiyang/?map=no'
 if(i>0):
 num = i+2 #除了第一页是空的,第二页开始按2顺序递增
 url = 'http://www.mayi.com/guiyang/' + str(num) + '/?map=no'
 gydzf(url)
 i=i+1
 
c.close()

输出结果如下,存储本地CSV文件:

Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题

同时,大家可以尝试Selenium爬取蚂蚁短租,应该也是可行的方法。

到此这篇关于Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的文章就介绍到这了,更多相关Python爬虫爬取蚂蚁短租内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解Python中的静态方法与类成员方法
Feb 28 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
Python3匿名函数用法示例
Jul 25 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
flask框架配置mysql数据库操作详解
Nov 29 Python
keras模型可视化,层可视化及kernel可视化实例
Jan 24 Python
python如何求数组连续最大和的示例代码
Feb 04 Python
Django的CVB实例详解
Feb 10 Python
Python基于requests库爬取网站信息
Mar 02 Python
Python如何在main中调用函数内的函数方式
Jun 01 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 Python
Python fileinput模块如何逐行读取多个文件
Oct 05 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
Feb 22 #Python
Python爬虫制作翻译程序的示例代码
Feb 22 #Python
Python爬虫爬取ts碎片视频+验证码登录功能
Feb 22 #Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 #Python
Python爬虫分析微博热搜关键词的实现代码
Feb 22 #Python
anaconda升级sklearn版本的实现方法
Feb 22 #Python
详解Python 中的 defaultdict 数据类型
Feb 22 #Python
You might like
php文件上传后端处理小技巧
2016/05/22 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
PHP加MySQL消息队列深入理解
2021/02/27 PHP
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
详解JavaScript中this的指向问题
2017/01/20 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
js获取浏览器的各种属性
2017/04/27 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
JavaScript动态创建二维数组的方法示例
2019/02/01 Javascript
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
[01:00:12]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第一场
2018/04/09 DOTA
Python编程求质数实例代码
2018/01/31 Python
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
详解python 注释、变量、类型
2018/08/10 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
Python如何使用vars返回对象的属性列表
2020/10/17 Python
Django权限控制的使用
2021/01/07 Python
家长写给老师的建议书
2014/03/13 职场文书
2014年团委工作总结
2014/11/13 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
2014年艾滋病防治工作总结
2014/12/10 职场文书
先进个人材料怎么写
2014/12/30 职场文书
客房领班岗位职责
2015/02/11 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
Pytorch中Softmax和LogSoftmax的使用详解
2021/06/05 Python
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技