万能爬虫框架

对于爬虫大部分情况下都是请求头的构造很难,难就难在你必须分析js代码,看看header中有那些验证信息,这些验证信息是怎么生成的,然后再在Python中写出生成的方法,这样就能构造出正确的请求头,有了正确的请求头,就一定能请求成功,但是对于很多网站,这样的方式在过于复杂,不是一个好的解决方案,所幸的是还有一种方案是万能的,它可以爬取任何网页和任何操作,这个方案就是使用谷歌或者火狐提供的自动化测试工具,谷歌的是Chromedriver.exe,这个程序打开是一个命令框,并且它带了很多操作浏览器的命令,可以令你完全模拟人去使用网页的操作,但是这还不够,你需要将这个程序做成一个自动化的脚本,这样才能爬取大量的内容,然而在Python中已经至少有一个库实现这些,比如selenium,但事实上你也可以自己将Chromediver给封装起来,也可以使用c++将其做成一些桌面程序等等,下面给出一个Python下爬取某网站图片的例子,

首先必须先下载Chromediver.exe接着将其放入当前Python环境的script目录下即可


```python
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import requests
from selenium.webdriver.support import wait
from selenium.webdriver.support import expected_conditions
 
 
chrome_options = webdriver.ChromeOptions()
# prefs = {
#     "profile.managed_default_content_settings.images":1,
#     'profile.managed_default_content_settings.javascript':1,
#     'profile.managed_default_content_settings.css':2,
 
#对Chrome进行一些设置,比如关闭脚本,不加载图片等等,1-不开启;2-开启
prefs = {
    'profile.default_content_setting_values': {
        'images': 1,
        'javascript': 2,
    }
}
chrome_options.headless=True #设置无头模式,就是没有界面,也就意味着不去渲染css和style,可以价快速度
chrome_options.add_experimental_option("prefs",prefs)
for i in chrome_options.to_capabilities().items():
    print(i)
browser = webdriver.Chrome(chrome_options=chrome_options)#创建一个Chromediver并传入一个设置
# browser = webdriver.Chrome()
 
 
# dcap = dict(DesiredCapabilities.PHANTOMJS)  # 设置userAgent
# dcap["phantomjs.page.settings.userAgent"] = (
#     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36")
# browser = webdriver.PhantomJS(executable_path='phantomjs.exe', desired_capabilities=dcap)  # 加载网址
# browser.set_window_size(0,0)
# browser.img
script='''
var clear=function () {
    console.log('**********************')
    var img_list=document.getElementsByTagName('img');
    for (var i = 0; i <img_list.length;i++){
        var img=img_list[i];
        var url=img.getAttribute('src');
        if (url !==''){
            img.setAttribute('src','');
        }
    }
};
setInterval(clear) ;
'''
print('load 。。。。')
browser.execute_script(script)#执行屏蔽图片的脚本,也可以屏蔽其他内容,这里也可以使用谷歌的拓展插件取实现。
browser.get('http://www.taobao.com')  # 打开网址
print('load finished')
# browser.set_window_size(640,320)
# browser.execute_async_script(script)
 
# browser.get()
browser.implicitly_wait(10)#设置网页加载的最大等待时间,并非固定时间
browser.save_screenshot("1.png")  # 截图保存
print('start find......')
 
# print(browser.page_source)
'''开始获取数据,但是此时网页未必加载完毕,所以需要循环取判断目标元素是否加载完毕'''
import time
while 1:
    a=browser.find_elements_by_class_name('img-wrapper')
    print('finding...', len(a))
    if len(a)>10:
        for i,e in enumerate(a):
            src=e.find_element_by_tag_name('img').get_property('src')
            response=requests.get(src)
            print(src)
            with open(str(i)+'.jpg','wb') as f:
                f.write(response.content)
        break
    time.sleep(0.5)
browser.quit()  # 关闭浏览器。当出现异常时记得在任务浏览器中关闭PhantomJS,因为会有多个PhantomJS在运行状态,影响电脑性能

 

YayCrawler是一个基于WebMagic开发的分布式通用爬虫框架,开发语言是Java。我们知道目前爬虫框架很多,有简单的,也有复杂的,有轻 量型的,也有重量型的。您也许会问:你这个爬虫框架的优势在哪里呢?额,这个是一个很重要的问题!在这个开篇中,我先简单的介绍一下我这个爬虫框架的特 点,后面的章幅会详细介绍并讲解它的实现,一图胜千言:1、分布式:YayCrawler就是一个大哥(Master)多个小弟(Worker)的架构(这种结构才是宇宙的真理),当然大哥还有一个小秘(Admin)和外界交往。2、通用性:我们很多时候需要爬取不同网站的数据,各个网站的结构和内容都有很大的差别,基本上大部分人都是遇到一个网站写一份代码,没法做到工具 的复用。YayCrawler就是想改变这种情况,把不同的部分抽象出来,用规则来指导爬虫做事。也就是说用户可以在界面上配置如何抓取某个页面的数据的 规则,等爬虫在爬取这个页面的时候就会用这个事先配置好的规则来解析数据,然后把数据持久化。3、可扩展的任务队列:任务队列由Redis实现,根据任务的状态有四种不同的任务队列:初始、执行中、成功、失败。您也可以扩展不同的任务调度算法,默认是公平调度。4、可定义持久化方式:爬取结果中,属性数据默认持久化到MongoDB,图片会被下载到文件服务器,当然您可以扩展更多的存储方式。5、稳定和容错:任何一个失败的爬虫任务都会重试和记录,只有任务真正成功了才会被移到成功队列,失败会有失败的原因描述。6、反监控组件:网站为了防止爬虫也是煞费苦心,想了一系列的监控手段来反爬虫。作为对立面,我们自然也要有反监控的手段来保障我们的爬虫任务,目前主要考虑的因素有:cookie失效(需要登陆)、刷验证码、封IP(自动换代理)。7、可以对任务设置定时刷新,比如隔一天更新某个网站的数据。作者博客地址:http://www.cnblogs.com/yuananyun 标签:爬虫
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值