BeaufulSoup 和lxml一样都是用于解析html的框架,对数据的分析和提取。
和lxml相比,效率略低,用起来比较方便
bs4需要下载安装: pip install bs4
2、jsonPath(了解)
安装:pip install jsonpath
3、selenium
selenium+phatomjs和selenium+chrome
selenium:是一种用于web程序测试的工具,selenium测试的代码可以直接运行在浏览器中,就像真正的用户操作一样。
在写python爬虫的时候,主要是用selenium的webdriver 来驱动浏览器进行相关的操作
安装:pip install selenium
selenium中元素查找:
find_element_by_id()
find_elements_by_name()
find_elements_by_xpath()
find_elements_by_tag_name()
find_elements_by_class_name()
find_elements_by_css_selector()
find_elements_by_link_text()
事件
click() 点击
send_keys()
switch_to_alert()
chromedriver:谷歌浏览器驱动
加载方法如下:
法一:driver = webdriver.Chrome(r'/Users/fanjianbo/Desktop/chromedriver')
法二:把chromedriver的目录配成环境变量路径,然后:driver = webdriver.Chrome()
【注意】chromedriver的版本要和chrome浏览器相对应,不然很多功能不能用
下载操作谷歌浏览器驱动的页面:http://chromedriver.storage.googleapis.com/index.html 或者 http://npm.taobao.org/mirrors/chromedriver/2.37/
谷歌驱动和谷歌浏览器版本之间的映射表:http://blog.csdn.net/huilan_same/article/details/51896672
phantomjs:无界面浏览器
加载方法如下:
法一:driver = webdriver.PhatomJS("C:UsersBLiDesktop1706day04ziliaophantomjs-2.1.1-windowsinphantomjs.exe")
法二:把phantomjs拷贝到c盘下,并把bin目录配置成环境变量,然后driver = webdriver.PhatomJS()
【注意】phantomjs目前已经不再更新
下载地址:http://phantomjs.org/download.html
4、面试题
1、如何动态加载的数据?
简单的ajax请求:抓包得到ajax的url对该url进行追踪
复杂的动态加载:一般采用selenium+chromedriver或selenium+PhantomJS,进行js代码的解析执行,得到其执行以后html字符串,进一步用xpath、bs4或正则来解析
2、迭代器,生成器,装饰器
迭代器:
生成器:
装饰器:不改变原函数的功能基础上,装饰(增加)新的功能,是的函数可以实现更加广泛的应用。这种设计模式好处,解耦合
3、Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)
赋值:把等号右边的数据,存储到左边变量所开辟的内存空间中
浅拷贝:只拷贝引用不拷贝对象本身,一旦有一个引用修改,所有的引用都会被迫修改
深拷贝:直接拷贝对象本身,产生一个新的对象,并且产生一个新的引用
4、什么是并行和并发?
并行:多个进程在同一时刻同时进行
并发:多个进程在同一时间段内交替进行 (操作系统大多采用并发机制)
5、什么是线程和进程?
进程:一个程序在操作系统中被执行以后就会创建一个进程,通过进程分配资源(cpu、内存、I/O设备),一个进程中会包含一到多个线程,其中有一个线程叫做主线程用于管理其他线程
线程:在一个进程执行的过程,一般会分成很多个小的执行单位,线程就是这些执行单位;在处理机调度,以线程为单位件进行,多个线程之间并发执行,线程占用的是cpu
多线程使用的场合:耗时操作(访问外存,即:I/O,访问网络资源),为了不阻碍主线程或者其他的操作,一般会采用多线程。
6、什么是协程?
协程是:在一个线程执行过程中可以在一个子程序的预定或者随机位置中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。他本身是一种特殊的子程序或者称作函数。
遇到IO密集型的业务时,多线程加上协程,你磁盘在那该读读该写写,我还能去干点别的。在WEB应用中效果尤为明显。
协程的好处:
跨平台跨体系架构无需线程上下文切换的开销无需原子操作锁定及同步的开销方便切换控制流,简化编程模型高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。
缺点:
无法利用多核资源:协程的本质是个单线程,它不能同时将单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序:这一点和事件驱动一样,可以使用异步IO操作来解决