网页知识
html,js,css,xpath这些知识,虽然简单,但一定需要了解。 你得知道这些网页是如何构成的,然后才能去分解他们
>
一般爬虫你需要模拟浏览器的 *** 作,才能去获取网页的信息
如果有些网站需要登录,才能获取更多的资料,你得去登录,你得把登录的账号密码进行提交
有些网站登录后需要保存cookie信息才能继续获取更多资料
正则表达式
有了正则表达式才能更好的分割网页信息,获取我们想要的数据,所以正则表达式也是需要了解的
一些重要的爬虫库
url,url2
beautiul Soup
数据库
爬取到的数据我们得有个地方来保存,可以使用文件,也可以使用数据库,这里我会使用mysql,还有更适合爬虫的MongoDB数据库,以及分布式要用到的redis 数据库
爬虫框架
PySpider和Scrapy 这两个爬虫框架是非常NB的,简单的爬虫可以使用urllib与urllib2以及正则表达式就能完成,但高级的爬虫还得用这两个框架。 这两个框架需要另行安装。后面一起学习
反爬虫
有时候你的网站数据想禁止别人爬取,可以做一些反爬虫处理 *** 作。 打比方百度上就无法去查找淘宝上的数据,这样就避开了搜索引擎的竞争,淘宝就可以搞自己的一套竞价排名
分布式爬虫
使用多个redis实例来缓存各台主机上爬取的数据。
爬虫要学的东西还是挺多的,想把爬虫玩得666,基本就是这些知识点吧!
一、什么是Selenium
selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。
二、selenium基本使用
用python写爬虫的时候,主要用的是selenium的Webdriver,我们可以通过下面的方式先看看SeleniumWebdriver支持哪些浏览器
执行结果如下,从结果中我们也可以看出基本山支持了常见的所有浏览器:
这里要说一下比较重要的PhantomJS,PhantomJS是一个而基于WebKit的服务端JavaScript API,支持Web而不需要浏览器支持,其快速、原生支持各种Web标准:Dom处理,CSS选择器,JSON等等。PhantomJS可以用用于页面自动化、网络监测、网页截屏,以及无界面测试
声明浏览器对象
上面我们知道了selenium支持很多的浏览器,但是如果想要声明并调用浏览器则需要:
from selenium import webdriver
browser = webdriverChrome()
browser = webdriverFirefox()
这里只写了两个例子,当然了其他的支持的浏览器都可以通过这种方式调用
访问页面
from selenium import webdriver
browser = webdriverChrome()
browserget("httiducom")print(browserpage_source)
browserclose()
上述代码运行后,会自动打开Chrome浏览器,并登陆百度打印百度首页的源代码,然后关闭浏览器
查找元素
单个元素查找
from selenium import webdriver
browser = webdriverChrome()
browserget("baocom")
input_first = browserfind_element_by_id("q")
input_second = browserfind_element_by_css_selector("#q")
input_third = browserfind_element_by_xpath('//[@id="q"]')print(input_first)print(input_second)print(input_third)
browserclose()
这里我们通过三种不同的方式去获取响应的元素,第一种是通过id的方式,第二个中是CSS选择器,第三种是xpath选择器,结果都是相同的。
结果如下:
这里列举一下常用的查找元素方法:
find_element_by_name
find_element_by_id
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
下面这种方式是比较通用的一种方式:这里需要记住By模块所以需要导入
from seleniumwebdrivercommonby import By
from selenium import webdriverfrom seleniumwebdrivercommonby import By
browser = webdriverChrome()
browserget("obaocom")
input_first = browserfind_element(ByID,"q")print(input_first)
browserclose()
当然这种方法和上述的方式是通用的,browserfind_element(ByID,"q")这里ByID中的ID可以替换为其他几个
多个元素查找
其实多个元素和单个元素的区别,举个例子:find_elements,单个元素是find_element,其他使用上没什么区别,通过其中的一个例子演示:
from selenium import webdriver
browser = webdriverChrome()
browserget("obaocom")
lis = browserfind_elements_by_css_selector('service-bd li')print(lis)
browserclose()
这样获得就是一个列表
当然上面的方式也是可以通过导入from seleniumwebdrivercommonby import By 这种方式实现
lis = browserfind_elements(ByCSS_SELECTOR,'service-bd li')
同样的在单个元素中查找的方法在多个元素查找中同样存在:
find_elements_by_name
find_elements_by_id
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
元素交互 *** 作
对于获取的元素调用交互方法
from selenium import webdriverimport time
browser = webdriverChrome()
browserget("baocom")
input_str = browserfind_element_by_id('q')
input_strsend_keys("ipad")
timesleep(1)
input_strclear()
input_strsend_keys("MakBook pro")
button = browserfind_element_by_class_name('btn-search')
buttonclick()
运行的结果可以看出程序会自动打开Chrome浏览器并打开淘宝输入ipad,然后删除,重新输入MakBook pro,并点击搜索
交互动作
将动作附加到动作链中串行执行
from selenium import webdriverfrom seleniumwebdriver import ActionChains
browser = webdriverChrome()
url = "ry/tryphpfilename=jqueryui-api-droppable"browserget(url)
browserswitch_toframe('iframeResult')
source = browserfind_element_by_css_selector('#draggable')
target = browserfind_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actionsdrag_and_drop(source, target)
actionsperform()
执行JavaScript
这是一个非常有用的方法,这里就可以直接调用js方法来实现一些 *** 作,
下面的例子是通过登录知乎然后通过js翻到页面底部,并d框提示
from selenium import webdriver
browser = webdriverChrome()
browserget("ucom/explore")
browserexecute_script('windowscrollTo(0, documentbodyscrollHeight)')
browserexecute_script('alert("To Bottom")')
获取元素属性
get_attribute('class')
from selenium import webdriver
browser = webdriverChrome()
url = 'hihucom/explore'browserget(url)
logo = browserfind_element_by_id('zh-top-link-logo')print(logo)print(logoget_attribute('class'))
获取文本值
text
from selenium import webdriver
browser = webdriverChrome()
url = 'com/explore'browserget(url)
input = browserfind_element_by_class_name('zu-top-add-question')print(inputtext)
获取ID,位置,标签名
id
location
tag_name
size
from selenium import webdriver
browser = webdriverChrome()
url = 'com/explore'browserget(url)
input = browserfind_element_by_class_name('zu-top-add-question')print(inputid)print(inputlocation)print(inputtag_name)print(inputsize)
Frame
在很多网页中都是有Frame标签,所以我们爬取数据的时候就涉及到切入到frame中以及切出来的问题,通过下面的例子演示
这里常用的是switch_tofrom()和switch_toparent_frame()
import timefrom selenium import webdriverfrom seleniumcommonexceptions import NoSuchElementException
browser = webdriverChrome()
url = 'oobcom/try/tryphpfilename=jqueryui-api-droppable'browserget(url)
browserswitch_toframe('iframeResult')
source = browserfind_element_by_css_selector('#draggable')print(source)try:
logo = browserfind_element_by_class_name('logo')except NoSuchElementException: print('NO LOGO')
browserswitch_toparent_frame()
logo = browserfind_element_by_class_name('logo')print(logo)print(logotext)
等待
当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常, 换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
隐式等待
到了一定的时间发现元素还没有加载,则继续等待我们指定的时间,如果超过了我们指定的时间还没有加载就会抛出异常,如果没有需要等待的时候就已经加载完毕就会立即执行
from selenium import webdriver
browser = webdriverChrome()
browserimplicitly_wait(10)
browserget('com/explore')
input = browserfind_element_by_class_name('zu-top-add-question')print(input)
显示等待
指定一个等待条件,并且指定一个最长等待时间,会在这个时间内进行判断是否满足等待条件,如果成立就会立即返回,如果不成立,就会一直等待,直到等待你指定的最长等待时间,如果还是不满足,就会抛出异常,如果满足了就会正常返回
from selenium import webdriverfrom seleniumwebdrivercommonby import Byfrom seleniumwebdriversupportui import WebDriverWaitfrom seleniumwebdriversupport import expected_conditions as EC
browser = webdriverChrome()
browserget('taobaocom/')
wait = WebDriverWait(browser, 10)
input = waituntil(ECpresence_of_element_located((ByID, 'q')))
button = waituntil(ECelement_to_be_clickable((ByCSS_SELECTOR, 'btn-search')))print(input, button)
上述的例子中的条件:ECpresence_of_element_located()是确认元素是否已经出现了
ECelement_to_be_clickable()是确认元素是否是可点击的
常用的判断条件:
title_is 标题是某内容
title_contains 标题包含某内容
presence_of_element_located 元素加载出,传入定位元组,如(ByID, 'p')
visibility_of_element_located 元素可见,传入定位元组
visibility_of 可见,传入元素对象
presence_of_all_elements_located 所有元素加载出
text_to_be_present_in_element 某个元素文本包含某文字
text_to_be_present_in_element_value 某个元素值包含某文字
frame_to_be_available_and_switch_to_it frame加载并切换
invisibility_of_element_located 元素不可见
element_to_be_clickable 元素可点击
staleness_of 判断一个元素是否仍在DOM,可判断页面是否已经刷新
element_to_be_selected 元素可选择,传元素对象
element_located_to_be_selected 元素可选择,传入定位元组
element_selection_state_to_be 传入元素对象以及状态,相等返回True,否则返回False
element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False
alert_is_present 是否出现Alert
浏览器的前进和后退
back()
forward()
import timefrom selenium import webdriver
browser = webdriverChrome()
browserget('wwbaiducom/')
browserget('aobaocom/')
browserget('wwpythonorg/')
browserback()
timesleep(1)
browserforward()
browserclose()
cookie *** 作
get_cookies()
delete_all_cookes()
add_cookie()
from selenium import webdriver
browser = webdriverChrome()
browserget('om/explore')print(browserget_cookies())
browseradd_cookie({'name': 'name', 'domain': '>
选项卡管理
通过执行js命令实现新开选项卡windowopen()
不同的选项卡是存在列表里browserwindow_handles
通过browserwindow_handles[0]就可以 *** 作第一个选项卡
import timefrom selenium import webdriver
browser = webdriverChrome()
browserget('baiducom')
browserexecute_script('windowopen()')print(browserwindow_handles)
browserswitch_to_window(browserwindow_handles[1])
browserget('baocom')
timesleep(1)
browserswitch_to_window(browserwindow_handles[0])
browserget('honorg')
异常处理
这里只进行简单的演示,查找一个不存在的元素
from selenium import webdriverfrom seleniumcommonexceptions import TimeoutException, NoSuchElementException
browser = webdriverChrome()try:
browserget('ducom')except TimeoutException: print('Time Out')try:
browserfind_element_by_id('hello')except NoSuchElementException: print('No Element')finally:
browserclose()
所有的努力都值得期许,每一份梦想都应该灌溉!
欲精通Python网络爬虫,必先了解网络爬虫学习路线,本篇经验主要解决这个问题。部分内容参考自书籍《精通Python网络爬虫》。
作者:韦玮
转载请注明出处
随着大数据时代的到来,人们对数据资源的需求越来越多,而爬虫是一种很好的自动采集数据的手段。
那么,如何才能精通Python网络爬虫呢?学习Python网络爬虫的路线应该如何进行呢?在此为大家具体进行介绍。
1、选择一款合适的编程语言
事实上,Python、PHP、JAVA等常见的语言都可以用于编写网络爬虫,你首先需要选择一款合适的编程语言,这些编程语言各有优势,可以根据习惯进行选择。在此笔者推荐使用Python进行爬虫项目的编写,其优点是:简洁、掌握难度低。
2、掌握Python的一些基础爬虫模块
当然,在进行这一步之前,你应当先掌握Python的一些简单语法基础,然后才可以使用Python语言进行爬虫项目的开发。
在掌握了Python的语法基础之后,你需要重点掌握一个Python的关于爬虫开发的基础模块。这些模块有很多可以供你选择,比如urllib、requests等等,只需要精通一个基础模块即可,不必要都精通,因为都是大同小异的,在此推荐的是掌握urllib,当然你可以根据你的习惯进行选择。
3、深入掌握一款合适的表达式
学会了如何爬取网页内容之后,你还需要学会进行信息的提取。事实上,信息的提取你可以通过表达式进行实现,同样,有很多表达式可以供你选择使用,常见的有正则表达式、XPath表达式、BeautifulSoup等,这些表达式你没有必要都精通,同样,精通1-2个,其他的掌握即可,在此建议精通掌握正则表达式以及XPath表达式,其他的了解掌握即可。正则表达式可以处理的数据的范围比较大,简言之,就是能力比较强,XPath只能处理XML格式的数据,有些形式的数据不能处理,但XPath处理数据会比较快。
4、深入掌握抓包分析技术
事实上,很多网站都会做一些反爬措施,即不想让你爬到他的数据。最常见的反爬手段就是对数据进行隐藏处理,这个时候,你就无法直接爬取相关的数据了。作为爬虫方,如果需要在这种情况下获取数据,那么你需要对相应的数据进行抓包分析,然后再根据分析结果进行处理。一般推荐掌握的抓包分析工具是Fiddler,当然你也可以用其他的抓包分析工具,没有特别的要求。
5、精通一款爬虫框架
事实上,当你学习到这一步的时候,你已经入门了。
这个时候,你可能需要深入掌握一款爬虫框架,因为采用框架开发爬虫项目,效率会更加高,并且项目也会更加完善。
同样,你可以有很多爬虫框架进行选择,比如Scrapy、pySpider等等,一样的,你没必要每一种框架都精通,只需要精通一种框架即可,其他框架都是大同小异的,当你深入精通一款框架的时候,其他的框架了解一下事实上你便能轻松使用,在此推荐掌握Scrapy框架,当然你可以根据习惯进行选择。
6、掌握常见的反爬策略与反爬处理策略
反爬,是相对于网站方来说的,对方不想给你爬他站点的数据,所以进行了一些限制,这就是反爬。
反爬处理,是相对于爬虫方来说的,在对方进行了反爬策略之后,你还想爬相应的数据,就需要有相应的攻克手段,这个时候,就需要进行反爬处理。
事实上,反爬以及反爬处理都有一些基本的套路,万变不离其宗,这些后面作者会具体提到,感兴趣的可以关注。
常见的反爬策略主要有:
IP限制
UA限制
Cookie限制
资源随机化存储
动态加载技术
……
对应的反爬处理手段主要有:
IP代理池技术
用户代理池技术
Cookie保存与处理
自动触发技术
抓包分析技术+自动触发技术
……
这些大家在此先有一个基本的思路印象即可,后面都会具体通过实战案例去介绍。
7、掌握PhantomJS、Selenium等工具的使用
有一些站点,通过常规的爬虫很难去进行爬取,这个时候,你需要借助一些工具模块进行,比如PhantomJS、Selenium等,所以,你还需要掌握PhantomJS、Selenium等工具的常规使用方法。
8、掌握分布式爬虫技术与数据去重技术
如果你已经学习或者研究到到了这里,那么恭喜你,相信现在你爬任何网站都已经不是问题了,反爬对你来说也只是一道形同虚设的墙而已了。
但是,如果要爬取的资源非常非常多,靠一个单机爬虫去跑,仍然无法达到你的目的,因为太慢了。
所以,这个时候,你还应当掌握一种技术,就是分布式爬虫技术,分布式爬虫的架构手段有很多,你可以依据真实的服务器集群进行,也可以依据虚拟化的多台服务器进行,你可以采用urllib+redis分布式架构手段,也可以采用Scrapy+redis架构手段,都没关系,关键是,你可以将爬虫任务部署到多台服务器中就OK。
至于数据去重技术,简单来说,目的就是要去除重复数据,如果数据量小,直接采用数据库的数据约束进行实现,如果数据量很大,建议采用布隆过滤器实现数据去重即可,布隆过滤器的实现在Python中也是不难的。
以上是如果你想精通Python网络爬虫的学习研究路线,按照这些步骤学习下去,可以让你的爬虫技术得到非常大的提升。
至于有些朋友问到,使用Windows系统还是Linux系统,其实,没关系的,一般建议学习的时候使用Windows系统进行就行,比较考虑到大部分朋友对该系统比较数据,但是在实际运行爬虫任务的时候,把爬虫部署到Linux系统中运行,这样效率比较高。由于Python的可移植性非常好,所以你在不同的平台中运行一个爬虫,代码基本上不用进行什么修改,只需要学会部署到Linux中即可。所以,这也是为什么说使用Windows系统还是Linux系统进行学习都没多大影响的原因之一。
本篇文章主要是为那些想学习Python网络爬虫,但是又不知道从何学起,怎么学下去的朋友而写的。希望通过本篇文章,可以让你对Python网络爬虫的研究路线有一个清晰的了解,这样,本篇文章的目的就达到了,加油!
本文章由作者韦玮原创,转载请注明出处。
非常感谢各位的回答!但是小弟实在是无法从>
首先爬虫框架有三种
分布式爬虫:Nutch
JAVA单机爬虫:Crawler4j,WebMagic,WebCollector
非JAVA单机爬虫:scrapy
第一类:分布式爬虫优点:海量URL管理
网速快
缺点:Nutch是为搜索引擎设计的爬虫,大多数用户是需要一个做精准数据爬取(精抽取)的爬虫。Nutch运行的一套流程里,有三分之二是为了搜索引擎而设计的。对精抽取没有太大的意义。
用Nutch做数据抽取,会浪费很多的时间在不必要的计算上。而且如果你试图通过对Nutch进行二次开发,来使得它适用于精抽取的业务,基本上就要破坏Nutch的框架,把Nutch改的面目全非。
Nutch依赖hadoop运行,hadoop本身会消耗很多的时间。如果集群机器数量较少,爬取速度反而不如单机爬虫。
Nutch虽然有一套插件机制,而且作为亮点宣传。可以看到一些开源的Nutch插件,提供精抽取的功能。但是开发过Nutch插件的人都知道,Nutch的插件系统有多蹩脚。利用反射的机制来加载和调用插件,使得程序的编写和调试都变得异常困难,更别说在上面开发一套复杂的精抽取系统了。
Nutch并没有为精抽取提供相应的插件挂载点。Nutch的插件有只有五六个挂载点,而这五六个挂载点都是为了搜索引擎服务的,并没有为精抽取提供挂载点。大多数Nutch的精抽取插件,都是挂载在“页面解析”(parser)这个挂载点的,这个挂载点其实是为了解析链接(为后续爬取提供URL),以及为搜索引擎提供一些易抽取的网页信息(网页的meta信息、text)
用Nutch进行爬虫的二次开发,爬虫的编写和调试所需的时间,往往是单机爬虫所需的十倍时间不止。了解Nutch源码的学习成本很高,何况是要让一个团队的人都读懂Nutch源码。调试过程中会出现除程序本身之外的各种问题(hadoop的问题、hbase的问题)。
Nutch2的版本目前并不适合开发。官方现在稳定的Nutch版本是nutch221,但是这个版本绑定了gora-03。Nutch23之前、Nutch221之后的一个版本,这个版本在官方的SVN中不断更新。而且非常不稳定(一直在修改)。
第二类:JAVA单机爬虫优点:支持多线程。
支持代理。
能过滤重复URL的。
负责遍历网站和下载页面。爬js生成的信息和网页信息抽取模块有关,往往需要通过模拟浏览器(htmlunit,selenium)来完成。
缺点:设计模式对软件开发没有指导性作用。用设计模式来设计爬虫,只会使得爬虫的设计更加臃肿。第三类:非JAVA单机爬虫优点:先说python爬虫,python可以用30行代码,完成JAVA
50行代码干的任务。python写代码的确快,但是在调试代码的阶段,python代码的调试往往会耗费远远多于编码阶段省下的时间。
使用python开发,要保证程序的正确性和稳定性,就需要写更多的测试模块。当然如果爬取规模不大、爬取业务不复杂,使用scrapy这种爬虫也是蛮不错的,可以轻松完成爬取任务。
缺点:bug较多,不稳定。
爬虫可以爬取ajax信息么?网页上有一些异步加载的数据,爬取这些数据有两种方法:使用模拟浏览器(问题1中描述过了),或者分析ajax的>如果我已经可以生成我所需要的ajax请求(列表),如何用这些爬虫来对这些请求进行爬取?
爬虫往往都是设计成广度遍历或者深度遍历的模式,去遍历静态或者动态页面。爬取ajax信息属于deepweb(深网)的范畴,虽然大多数爬虫都不直接支持。但是也可以通过一些方法来完成。比如WebCollector使用广度遍历来遍历网站。爬虫的第一轮爬取就是爬取种子集合(seeds)中的所有url。简单来说,就是将生成的ajax请求作为种子,放入爬虫。用爬虫对这些种子,进行深度为1的广度遍历(默认就是广度遍历)。
爬虫怎么爬取要登陆的网站?这些开源爬虫都支持在爬取时指定cookies,模拟登陆主要是靠cookies。至于cookies怎么获取,不是爬虫管的事情。你可以手动获取、用>爬虫怎么抽取网页的信息?
开源爬虫一般都会集成网页抽取工具。主要支持两种规范:CSSSELECTOR和XPATH。
网页可以调用爬虫么?爬虫的调用是在Web的服务端调用的,平时怎么用就怎么用,这些爬虫都可以使用。
爬虫速度怎么样?单机开源爬虫的速度,基本都可以讲本机的网速用到极限。爬虫的速度慢,往往是因为用户把线程数开少了、网速慢,或者在数据持久化时,和数据库的交互速度慢。而这些东西,往往都是用户的机器和二次开发的代码决定的。这些开源爬虫的速度,都很可以。
最近刚好在学这个,对于一些第三方工具类或者库,一定要看官方tutorial啊。
学会用chrome network 分析请求,或者fiddler抓包分析。
普通的网页直接用>
以上就是关于python爬虫需要什么基础全部的内容,包括:python爬虫需要什么基础、用python写爬虫程序怎么调用工具包selenium、精通Python网络爬虫之网络爬虫学习路线等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)