python中模拟浏览器抓取网页(-)

优采云 发布时间: 2020-08-12 09:13

  我们再来看下边的事例:

  import urllib

url="http://blog.csdn.net/beliefer/article/details/51251757"

html=urllib.urlopen(url)

print html.read()

  在此事例中,我将网址改变了,改成访问csdn中的博客,此时便出现了下边的结果:

  403 Forbidden

  nginx

  从其中的403 Forbidden我们便可以发觉,此时网站禁止了程序的访问,这便是由于csdn网站设置了反爬虫机制,当网站检测到爬虫时,将会拒绝访问,所以我们会得到上述的结果。

  这时候我们便须要模拟浏览器进行访问,才能逃过网站的反爬虫机制,进而顺利的抓取我们想要的内容。

  下面就将用到一个神奇的库urllib2进行我们的模拟工作,这次同样是先上代码,然后进行解释:

  #coding=utf-8

import urllib2

import random

def getContent(url,headers):

"""

此函数用于抓取返回403禁止访问的网页

"""

random_header = random.choice(headers)

"""

对于Request中的第二个参数headers,它是字典型参数,所以在传入时

也可以直接将个字典传入,字典中就是下面元组的键值对应

"""

req =urllib2.Request(url)

req.add_header("User-Agent", random_header)

req.add_header("GET",url)

req.add_header("Host","blog.csdn.net")

req.add_header("Referer","http://www.csdn.net/")

content=urllib2.urlopen(req).read()

return content

url="http://blog.csdn.net/beliefer/article/details/51251757"

#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去

my_headers = ["Mozilla/5.0 (Windows NT 6.3; Win64; x64) 。。。 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36"]

print getContent(url,my_headers)

  使用前面的代码,我们 便可以正常抓取到此网页的信息了,那下边就来介绍一下怎样获得我们getContent函数中的这些须要使用的headers里的参数。

  既然我们是要模拟浏览器进行网页访问,那么这种参数自然须要我们去浏览器中寻觅了。

  首先我们点击步入即将爬取的那种网页,然后键盘右击页面,点击审查元素,将会出现下边的的框架,然后我们点击Network,这时候会发觉并没有出现我们所在的页面的信息,没关系,这时候我们刷新一下页面,便会出现如下图所示的信息了。

  

  这时候我们会看到第一行的51251757,而这正是我们网页的网址的前面的标号,这时候我们点击这个标号,便会出现下图所示的内容:

  

  这时候我们会发觉Headers,是不是有种眼前一亮的觉得,没错,你的直觉是对的,我们所须要的信息正在这个Headers上面。

  然后对照着代码中的须要的参数,将这种信息拷贝回来便可以使用了,因为这上面显示的信息正好是通配符对应的,所以我们拷贝使用也就很方便了。

  对于上述代码中的my_headers用的是一个列表你们也许会想你这是不是很作了,没事放那么多干嘛,用一个不就好了,其实对这一个网页来说这确实是多此一举,但这样写的话这个函数的好处就扩大了,当我们单个访问时,将列表中倒入一个主机的信息就行了,但当我们要抓取一个网站的多个网页时,会很容易由于一台主机频繁访问而被网站检测下来,进而受到屏蔽。而假如我们在列表中多放些不同的主机号,然后随机使用,是不是就不容易被发觉了,当然,当我们为了防范这个时愈发好的方式是使用IP代理,因为我们不是很容易才能获得好多主机信息的,而IP代理是很容易从网上搜索到的,关于多次访问相关问题我会在下一篇博客中解释,在此就不多说了。

  对于解释中有哪些不对的地方欢迎你们见谅灌水。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线