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

      对于平时我们抓取网页的内容时,比较倾向于直接利用urllib进行抓取(这里我就基于python的2.7版本进行解说,对于python3之后的版本,是将python中的urllib和urllib2和并成了urllib),但有些网站设置了防采集的功能,会拒绝爬虫进行数据的采集,这时候便可以模拟浏览器进行网页访问,然后抓取需要的数据。

下面是一个简单的访问:

import urllib

url="http://www.csdn.net/"
html=urllib.urlopen(url)
print html.read()
使用上面的程序,将会访问到csdn网站的首页并将显示此网页的源码。

我们再来看下面的例子:

import urllib

url="http://blog.csdn.net/beliefer/article/details/51251757"
html=urllib.urlopen(url)
print html.read()
在此例子中,我将网址改变了,改成访问csdn中的博客,此时便出现了下面的结果:

<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>

     从其中的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代理是很容易从网上搜索到的,关于多次访问相关问题我会在下一篇博客中解释,在此就不多说了。

        对于解释中有什么不对的地方欢迎大家指正灌水。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python爬虫是一种用于自动化获取网页数据的程序。它可以通过发送HTTP请求,解析HTML页面,并提取所需的信息。对于静态网页,爬虫可以直接通过请求获取到页面的HTML代码,然后使用解析库(如BeautifulSoup)来提取所需的数据。但是对于动态网页,情况稍有不同。 动态网页是指在页面加载过程,通过JavaScript等技术动态生成内容的网页。这些内容可能是通过Ajax请求获取的,或者是在页面加载完成后通过JavaScript代码生成的。因此,对于动态网页抓取,我们需要模拟浏览器行为来执行JavaScript代码,并获取最终生成的HTML内容。 在Python,有一些库可以帮助我们实现动态网页抓取,其比较常用的是Selenium和Pyppeteer。这两个库都可以模拟浏览器行为,并且支持执行JavaScript代码。你可以根据自己的需求选择其一个进行使用。 使用Selenium进行动态网页抓取的基本步骤如下: 1. 安装Selenium库:使用pip命令安装selenium库。 2. 下载浏览器驱动:根据你使用的浏览器(如Chrome、Firefox等)下载对应的浏览器驱动,并将其添加到系统路径。 3. 创建WebDriver对象:使用Selenium的WebDriver类创建一个浏览器对象,如ChromeDriver。 4. 打开网页:使用WebDriver对象的get方法打开目标网页。 5. 执行JavaScript代码:如果页面有动态生成的内容,可以使用WebDriver对象的execute_script方法执行JavaScript代码。 6. 提取数据:使用Selenium提供的方法或者其他解析库(如BeautifulSoup)来提取所需的数据。 使用Pyppeteer进行动态网页抓取的基本步骤如下: 1. 安装Pyppeteer库:使用pip命令安装pyppeteer库。 2. 安装Chromium浏览器:Pyppeteer依赖于Chromium浏览器,需要先安装Chromium浏览器。 3. 创建Browser对象:使用Pyppeteer的launch方法创建一个浏览器对象。 4. 创建Page对象:使用Browser对象的newPage方法创建一个页面对象。 5. 打开网页:使用Page对象的goto方法打开目标网页。 6. 执行JavaScript代码:如果页面有动态生成的内容,可以使用Page对象的evaluate方法执行JavaScript代码。 7. 提取数据:使用Pyppeteer提供的方法或其他解析库(如BeautifulSoup)来提取所需的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值