• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
Vonice 显示全部楼层 发表于 2021-10-25 20:02:00 |阅读模式 打印 上一主题 下一主题
我们在编写Python爬虫时,有时会遇到网站拒绝访问等反爬本领,好比这么我们想爬取蚂蚁短租数据,它则会提示“当前访问疑似黑客攻击,已被网站管理员设置为拦截”提示,如下图所示。此时我们必要采用设置Cookie来举行爬取,下面我们举行具体先容。非常感谢我的学生承峰提供的头脑,后浪推前浪啊!
一. 网站分析与爬虫拦截

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

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

通过欣赏器检察元素,我们可以看到必要爬取每条租房信息都位于<dd></dd>节点下。

很多人学习python,不知道从何学起。
很多人学习python,把握了根本语法过后,不知道在那里探求案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给各人提供一个好的学习平台,免费领取视频教程,电子册本,以及课程的源代码!
QQ群:810735403
在定位房屋名称,如下图所示,位于<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. url = 'http://www.mayi.com/guiyang/?map=no'
  7. response=urllib.urlopen(url)
  8. contents = response.read()
  9. soup = BeautifulSoup(contents, "html.parser")
  10. print soup.title
  11. print soup
  12. #短租房名称
  13. for tag in soup.find_all('dd'):
  14. for name in tag.find_all(attrs={"class":"room-detail clearfloat"}):
  15. fname = name.find('p').get_text()
  16. 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. def gydzf(url):
  7. 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"
  8. headers={"User-Agent":user_agent}
  9. request=urllib2.Request(url,headers=headers)
  10. response=urllib2.urlopen(request)
  11. contents = response.read()
  12. soup = BeautifulSoup(contents, "html.parser")
  13. for tag in soup.find_all('dd'):
  14. #短租房名称
  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()
  18. #短租房价格
  19. for price in tag.find_all(attrs={"class":"moy-b"}):
  20. string = price.find('p').get_text()
  21. fprice = re.sub("[¥]+".decode("utf8"), "".decode("utf8"),string)
  22. fprice = fprice[0:5]
  23. print u'[短租房价格]', fprice.replace('\n','').strip()
  24. #评分及评论人数
  25. for score in name.find('ul'):
  26. fscore = name.find('ul').get_text()
  27. print u'[短租房评分/评论/居住人数]', fscore.replace('\n','').strip()
  28. #网页链接url
  29. url_dzf = tag.find(attrs={"target":"_blank"})
  30. urls = url_dzf.attrs['href']
  31. print u'[网页链接]', urls.replace('\n','').strip()
  32. urlss = 'http://www.mayi.com' + urls + ''
  33. print urlss
  34. #主函数
  35. if __name__ == '__main__':
  36. i = 1
  37. while i<10:
  38. print u'页码', i
  39. url = 'http://www.mayi.com/guiyang/' + str(i) + '/?map=no'
  40. gydzf(url)
  41. i = i+1
  42. else:
  43. 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
复制代码

接下来我们想获取具体信息

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

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

然后在Python代码中设置这些参数,再调用Urllib2.Request()提交哀求即可,核心代码如下:
  1. user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/61.0.3163.100 Safari/537.36"
  2. cookie="mediav=%7B%22eid%22%3A%22387123...b3574ef2-21b9-11e8-b39c-1bc4029c43b8"
  3. headers={"User-Agent":user_agent,"Cookie":cookie}
  4. request=urllib2.Request(url,headers=headers)
  5. response=urllib2.urlopen(request)
  6. contents = response.read()
  7. soup = BeautifulSoup(contents, "html.parser")
  8. for tag1 in soup.find_all(attrs={"class":"main"}):
复制代码
注意,每小时Cookie会更新一次,我们必要手动修改Cookie值即可,就是上面代码的cookie变量和user_agent变量。完备代码如下所示:
  1. import urllib2
  2. import re
  3. from bs4 import BeautifulSoup
  4. import codecs
  5. import csv
  6. c = open("ycf.csv","wb") #write 写
  7. c.write(codecs.BOM_UTF8)
  8. writer = csv.writer(c)
  9. writer.writerow(["短租房名称","地址","价格","评分","可住人数","人均价格"])
  10. #爬取详细信息
  11. def getInfo(url,fname,fprice,fscore,users):
  12. #通过浏览器开发者模式查看访问使用的user_agent及cookie设置访问头(headers)避免反爬虫,且每隔一段时间运行要根据开发者中的cookie更改代码中的cookie
  13. 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"
  14. cookie="mediav=%7B%22eid%22%3A%22387123%22eb7; mayi_uuid=1582009990674274976491; sid=42200298656434922.85.130.130"
  15. headers={"User-Agent":user_agent,"Cookie":cookie}
  16. request=urllib2.Request(url,headers=headers)
  17. response=urllib2.urlopen(request)
  18. contents = response.read()
  19. soup = BeautifulSoup(contents, "html.parser")
  20. #短租房地址
  21. for tag1 in soup.find_all(attrs={"class":"main"}):
  22. print u'短租房地址:'
  23. for tag2 in tag1.find_all(attrs={"class":"desWord"}):
  24. address = tag2.find('p').get_text()
  25. print address
  26. #可住人数
  27. print u'可住人数:'
  28. for tag4 in tag1.find_all(attrs={"class":"w258"}):
  29. yy = tag4.find('span').get_text()
  30. print yy
  31. fname = fname.encode("utf-8")
  32. address = address.encode("utf-8")
  33. fprice = fprice.encode("utf-8")
  34. fscore = fscore.encode("utf-8")
  35. fpeople = yy[2:3].encode("utf-8")
  36. ones = int(float(fprice))/int(float(fpeople))
  37. #存储至本地
  38. writer.writerow([fname,address,fprice,fscore,fpeople,ones])
  39. #爬虫函数
  40. def gydzf(url):
  41. 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"
  42. headers={"User-Agent":user_agent}
  43. request=urllib2.Request(url,headers=headers)
  44. response=urllib2.urlopen(request)
  45. contents = response.read()
  46. soup = BeautifulSoup(contents, "html.parser")
  47. for tag in soup.find_all('dd'):
  48. #短租房名称
  49. for name in tag.find_all(attrs={"class":"room-detail clearfloat"}):
  50. fname = name.find('p').get_text()
  51. print u'[短租房名称]', fname.replace('\n','').strip()
  52. #短租房价格
  53. for price in tag.find_all(attrs={"class":"moy-b"}):
  54. string = price.find('p').get_text()
  55. fprice = re.sub("[¥]+".decode("utf8"), "".decode("utf8"),string)
  56. fprice = fprice[0:5]
  57. print u'[短租房价格]', fprice.replace('\n','').strip()
  58. #评分及评论人数
  59. for score in name.find('ul'):
  60. fscore = name.find('ul').get_text()
  61. print u'[短租房评分/评论/居住人数]', fscore.replace('\n','').strip()
  62. #网页链接url
  63. url_dzf = tag.find(attrs={"target":"_blank"})
  64. urls = url_dzf.attrs['href']
  65. print u'[网页链接]', urls.replace('\n','').strip()
  66. urlss = 'http://www.mayi.com' + urls + ''
  67. print urlss
  68. getInfo(urlss,fname,fprice,fscore,user_agent)
  69. #主函数
  70. if __name__ == '__main__':
  71. i = 0
  72. while i<33:
  73. print u'页码', (i+1)
  74. if(i==0):
  75. url = 'http://www.mayi.com/guiyang/?map=no'
  76. if(i>0):
  77. num = i+2 #除了第一页是空的,第二页开始按2顺序递增
  78. url = 'http://www.mayi.com/guiyang/' + str(num) + '/?map=no'
  79. gydzf(url)
  80. i=i+1
  81. c.close()
复制代码
输出效果如下,存储当地CSV文件:

同时,各人可以实行Selenium爬取蚂蚁短租,应该也是可行的方法。
到此这篇关于Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的文章就先容到这了,更多相干Python爬虫爬取蚂蚁短租内容请搜索脚本之家从前的文章或继续欣赏下面的相干文章希望各人以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作