#定义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浏览器,并需提供相应的浏览器程序路径。
下载驱动程序
在使用之前,需下载相应浏览器的驱动,官网已提供下载链接。下载完成,需将路径加入到系统环境变量的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'