python爬虫cookie池 与ip绑定_Python爬虫:设置Cookie解决网站拦截并爬取蚂蚁短租

前言

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

作者: Eastmount

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

我们在编写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()

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

二. 设置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

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

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

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

然后在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文件:

同时,大家可以尝试Selenium爬取蚂蚁短租,应该也是可行的方法。最后希望文章对您有所帮助,如果存在不足之处,请海涵~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Secret:加载和卸载静态字段

总览 首先&#xff0c;很自然地假设静态字段具有特殊的生命周期&#xff0c;并且在应用程序的生命周期中一直存在。 您可以假设它们存在于内存中的特殊位置&#xff0c;例如C或类元信息的perm gen中的内存开始。 但是&#xff0c;得知静态字段驻留在堆上&#xff0c;可以具有任…

HTTP协议详解(真的很经典)

转自&#xff1a;http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的协议&#xff0c;由于其简捷、快速的方式&#xff0c;适用于分布式超媒体信息系统。它于1990年…

NYOJ 63 小猴子下落

小猴子下落 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述 有一颗二叉树&#xff0c;最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3&#xff0c;&#xff0c;2的D次方减1。在结点1处放一个小猴子&#xff0…

python科学计算与图形渲染_宁哥Python科学计算与图形渲染库课程

50dccd474759c0ffd343efcac14f8ab2.png (259.41 KB, 下载次数: 0)2019-4-9 12:23 上传课程目录章节1: NumPy基础知识课时1NumPy简介14:05课时2搭建NumPy开发环境&#xff0c;验证NumPy开发环境17:08课时3源代码和数据下载章节2: NumPy数组课时4创建多维数组09:20课时5获取单个数…

http协议说明

今天公司有同事让我给他讲一讲http..然后自己写了一个示例代码,这如果都看不懂.那我也没办法了.... 1 <?php2 3 //这里服务器以apache举例.nginx.iis.他们实际上处理方式的都是同理4 //申明http链接的数据包 注意最后面有两个换号.这是告诉apache.数据包的结束,如果后面没…

JBoss模块示例–模块化Web应用程序

最近&#xff0c;我读了为什么没有标准来开发真正的模块化Web应用程序&#xff1f; 由Patroklos Papapetrou撰写&#xff08; 在Java Code Geeks中也有介绍 &#xff09;。 受本文的启发&#xff0c;我决定检查实际使用的JBoss模块 。 这篇文章逐步描述了我的实验。 我首先想到…

由MySql漏洞导致电脑被入侵(特征为新增加名为piress的帐户)

今天开机&#xff0c;突然发现新增了一个名为piress的账户&#xff0c;突然间就意识到我的电脑可能被入侵了。后来发现网上很多人都遇到这样的问题。经过一步步的查证&#xff0c;原来最近MySQL爆出一个安全漏洞&#xff0c;远程登录mysql&#xff0c;尝试225次后就可以绕过身份…

multiprocessing.manager管理的对象需要加锁吗_Go: 内存管理和分配

本文基于Go1.13当不再使用内存时&#xff0c;标准库会自动执行Go的内存管理即从分配到回收。尽管开发者不需要处理它&#xff0c;但是Go的底层管理进行了很好的优化并且充满了有趣的概念。堆上的分配内存管理被设计可以在并发环境快速执行并且集成了gc。让我们从一个例子开始&a…

NYOJ 35表达式求值

表达式求值 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;4描述 ACM队的mdd想做一个计算器&#xff0c;但是&#xff0c;他要做的不仅仅是一计算一个AB的计算器&#xff0c;他想实现随便输入一个表达式都能求出它的值的计算器&#xff0c;现在请…

Java EE6 CDI,命名组件和限定符

Java EE6的最大承诺之一就是简化了依赖注入的使用。 他们做到了&#xff0c;使用CDI 。 CDI代表Java EE的上下文和依赖注入&#xff0c;它提供了一个基础集&#xff0c;用于在企业应用程序中应用依赖注入。 在CDI之前&#xff0c;EJB 3还引入了依赖注入&#xff0c;但这有点基础…

c#获取当前目录的一些方法

【内容来源地址】&#xff1a;http://www.cnblogs.com/marcozh/archive/2008/10/19/1314667.html Assembly myAssembly Assembly.GetEntryAssembly(); string path myAssembly.Location; DirectoryInfo dr new DirectoryInfo(path); pathd…

linux里的进程简介

/sbin/init 内核启动的第一个用户级进程,引导用户空间服务 [kthreadd] 内核线程管理[migration/0] 用于进程在不同的CPU间迁移[ksoftirqd/0] 内核调度/管理第0个CPU软中断的守护进程[migration/1] 管理多核心[ksoftirqd/1] 内核调度/管…

python画画bup_Python中的高效Vector / Point类

实现高效的Vector / Point类的最佳方法是什么(甚至更好&#xff1a;是否有一个),可以在Python 2.7和3.x中使用&#xff1f;我找到了the blender-mathutils,但它们似乎只支持Python 3.x.然后是this Vector class,使用numpy,但它只是一个3D矢量.使用具有静态属性(x和y)的像kivy’…

CSDN 编程挑战——《coder的计算器》

coder的计算器 题目详情: coder现在已经上初中&#xff0c;也会用计算器实现 ,-,*,/和幂运算^了&#xff0c;但他觉得市场那些计算器太繁琐了&#xff0c;有很多他不认识的符号&#xff0c;所以他现在很想要能计算带括号的 ,-,*,/和幂运算^的混合表达式就可以了&#xff0c;你…

OpenShift Express:部署Java EE应用程序(支持AS7)

在过去的几年中&#xff0c;我越来越听到有关“云”服务的信息。 最初&#xff0c;我并不是很想尝试一下。 但是几个月后&#xff08;一年&#xff1f;&#xff09;&#xff0c;我决定看看这是怎么回事。 我从事Java EE开发已经超过7年了&#xff0c;所以我决定看看将Java EE应…

07 总结ProgressDialog 异步任务

1,ProgressDialog> //使用对象 设置标题 progressDialog.setTitle("标题"); //设置图标 progressDialog.setIcon(R.drawable.ic_launcher); //设置展示的内容 progressDialog.setMessage(&q…

python函数封装计算n运算_在Python里面怎么可以运算出999999999**999999999,求思路?...

>>> 999999999 * math.log(999999999, 2) / 8 / 1024 ** 33.480509950621777所以这个数字本身就差不多需要3.5GB内存&#xff0c;考虑到计算过程中需要存储临时结果&#xff0c;还需要翻个两三倍吧而Python中的long可以到多少呢&#xff1a;#define MAX_LONG_DIGITS \…

C++中const关键字的使用总结

const是不变的意思&#xff0c;在C程序中&#xff0c;经常用const来限制对一个对象的操作: 1.1 const变量 例如&#xff1a; const int n3; 则这个变量的值不能改变&#xff0c;即不能对变量赋值。 1.2 const参数 出现在函数参数中的const表示在函数体中不能对这个参数做修改…

php封装redis负载均衡类

$array array( master > array( "redis://127.0.0.1:6379?timeout1", ), slave > array( "redis://127.0.0.1:6479?timeout1", "redis://127.0.0.1:6579?timeout1", ) ); $redis R…

我今天对JavaFX的了解

如果您没有听说过&#xff0c;JavaFX 2是Java的新Desktop / web / client框架。 自JavaFX 1以来&#xff0c;它已经进行了相当大的改动&#xff08;坦率地说&#xff0c;效果并不那么令人印象深刻&#xff09;。 自定义脚本语言已经淘汰了&#xff0c;您可以使用标准Java和基于…