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 相关文章推荐
10款最好的Web开发的 Python 框架
Mar 18 Python
Python爬取京东的商品分类与链接
Aug 26 Python
python+opencv轮廓检测代码解析
Jan 05 Python
numpy.random.seed()的使用实例解析
Feb 03 Python
python实现微信小程序自动回复
Sep 10 Python
Python3 串口接收与发送16进制数据包的实例
Jun 12 Python
python频繁写入文件时提速的方法
Jun 26 Python
Python代理IP爬虫的新手使用教程
Sep 05 Python
全网最细 Python 格式化输出用法讲解(推荐)
Jan 18 Python
Python绘制K线图之可视化神器pyecharts的使用
Mar 02 Python
详解Python魔法方法之描述符类
May 26 Python
Python合并pdf文件的工具
Jul 01 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语法速查表
2006/12/06 PHP
php显示时间常用方法小结
2015/06/05 PHP
php邮件发送的两种方式
2020/04/28 PHP
PHP中list方法用法示例
2016/12/01 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
2016/12/29 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
jquery $.ajax入门应用二
2008/11/19 Javascript
javascript 全角转换实现代码
2009/07/17 Javascript
jQuery Deferred和Promise创建响应式应用程序详细介绍
2013/03/05 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
bootstrap警告框使用方法解析
2017/01/13 Javascript
bootstrap输入框组件使用方法详解
2017/01/19 Javascript
js选项卡的制作方法
2017/01/23 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
微信小程序实现搜索功能
2020/03/10 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
vue组件是如何解析及渲染的?
2021/01/13 Vue.js
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
Python3学习笔记之列表方法示例详解
2017/10/06 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
2018/01/05 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
给我一面国旗 python帮你实现
2019/09/30 Python
python线程信号量semaphore使用解析
2019/11/30 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
HTML5 移动页面自适应手机屏幕四类方法总结
2017/08/17 HTML / CSS
Yahoo-PHP面试题2
2014/12/06 面试题
yy生日主持词
2014/03/20 职场文书
论文指导教师评语
2014/04/28 职场文书
检查机关领导群众路线教育实践活动个人整改措施
2014/10/28 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
单位收入证明范本
2015/06/18 职场文书