用scrapy爬取动态网页,class=ag_ele_a为何查找不到?

#定义spider组件,继承自scrapy.Spider
class Spider(scrapy.Spider):
 
 
    name = "spider_girl"
    allowed_domains = ["tieba.baidu.com"]
    start_urls = ["http://tieba.baidu.com/p/4721853678#!/l/p1"] #指定需要爬取的起始url
 
    # 用来去重的集合,首先将起始网址添加进去
    crawed_urls = {"http://tieba.baidu.com/p/4721853678#!/l/p1"}
 
    #设置自己的cookies
    cookies = {}
    #设置自己的headers
    headers = {
         'Connection': 'keep - alive',
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36'
    }
 
 
    #重写该函数,在该函数中返回Request对象,可以设置cookies,headers参数
    def start_requests(self):
        yield Request(self.start_urls[0],callback=self.parse, headers=self.headers)
 
     #只需要重写该函数即可,框架会自动回调该函数
    def parse(self, response):
        print response.text

遇到抓取动态网页内容的难题了吗?不必忧心,这篇文章将立即向你展示解决之道!

动态网页爬取难题

在爬取网页的过程中,许多人试图寻找特定的标签,比如“class=”。虽然他们在浏览器中打开网页时能够看到这些标签,但在控制台输出的页面源代码中却无法找到。这种情况的发生,是因为所爬取的网页内容是静态的,并未包含动态加载的部分。这实际上也是爬取动态网页时常常遇到的一个难题。

了解原因所在

pip install selenium

网页分为动态和静态两种类型。当我们通过浏览器浏览时,看到的是经过渲染和加载后的最终效果,而如果我们直接进行爬取,获取到的则是静态内容。这就像我们在浏览器中看到的网页,就像是已经装修完毕的房子,而直接爬取得到的则仅仅是未装修的毛坯房,缺少了动态加载的装饰部分。这也是为什么我们无法查找到“class=”标签的原因。

from selenium import webdriver

使用特定模块

#构造一个webdriver对象
browser = webdriver.Ie(executable_path='D:IEDriverIEDriverServer.exe')
#模拟网络请求
browser.get(self.start_urls[0])
#输出请求后的网页页面源代码
print browser.page_source

为了解决这一问题,我们可选择安装特定的模块以实现动态内容的抓取。模块安装妥当后,即可开始使用这些模块。使用时,首先需构建一个对象,并利用该对象的get()方法来模拟网络上的请求操作。接着,我们可以检查请求得到的网页代码,并通过对象的属性来获取所需信息。在构建对象的过程中,我们采用IE浏览器,并需提供相应的浏览器程序路径。

下载驱动程序

图片[1]-用scrapy爬取动态网页,class=ag_ele_a为何查找不到?-东山笔记

在使用之前,需下载相应浏览器的驱动,官网已提供下载链接。下载完成,需将路径加入到系统环境变量的path中。若不这样做,程序运行时将出现“‘.exe’需位于PATH中”的错误提示。打个比方,不设置环境变量就如同开车时油箱空了,车辆就无法启动。

#定义spider组件,继承自scrapy.Spider
class Spider(scrapy.Spider):
 
    name = "spider_girl"
    allowed_domains = ["tieba.baidu.com"]
    start_urls = ["http://tieba.baidu.com/p/4721853678#!/l/p1"] #指定需要爬取的起始url
 
    # 用来去重的集合,首先将起始网址添加进去
    crawed_urls = {"http://tieba.baidu.com/p/4721853678#!/l/p1"}
 
    #设置自己的cookies
    cookies = {}
    #设置自己的headers
    headers = {
         'Connection': 'keep - alive',
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36'
    }
 
    #构造一个webdriver对象
    def __init__(self):
        self.browser = webdriver.Ie(executable_path='D:IEDriverIEDriverServer.exe')
 
    #释放webdriver对象
    def __del__(self):
        self.browser.close()
 
    #重写该函数,在该函数中返回Request对象,可以设置cookies,headers参数
    def start_requests(self):
        self.browser.get(self.start_urls[0])
        yield Request(self.start_urls[0],callback=self.parse, headers=self.headers)
 
     #只需要重写该函数即可,框架会自动回调该函数
    def parse(self, response):
        print self.browser.page_source

成功爬取测试

在将驱动程序路径加入到环境变量中之后,执行程序以打印出网页的源代码,然后对“class=”这一字符串进行查找。此时,若能成功找到,便表明动态网页的内容已被成功抓取。这得益于它模仿了用户通过浏览器打开网页的动作,所获取的是已经加载并渲染完成的网页内容。

注意事项

若安装了相应模块并尝试运行程序时,系统会显示“‘.exe’需要位于PATH中”的错误提示,即便你已经将其添加到了环境变量里。在这种情况下,你可以在传递字符串参数之前加上“r”,这样做可以有效避免错误,并且能够模拟浏览器访问网页的行为,同时不会打开浏览器窗口。此外,在模拟浏览器访问动态网页的过程中,需留意解析得到的动态网页代码应被视为对象的特定属性,而非解析函数的参数。同时,应将这一属性传递给相应的解析程序。

self.browser = webdriver.PhantomJS(executable_path=r'D:spider_toolphantomjs-2.1.1-windowsbinphantomjs.exe')

在抓取那些不断变化的网页内容时,大家是否遭遇过其他难题?欢迎在评论区分享您的经历,同时别忘了为这篇文章点赞和转发!

executable_path=r'D:spider_toolphantomjs-2.1.1-windowsbinphantomjs.exe'

© 版权声明
THE END
喜欢就支持一下吧
分享