
这里介绍一种简单的方式—BeautifulSoup,利用BeautifulSoup将爬虫获取到的html页面转化为树形结构,然后再根据需要提取标签的内容及属性,不需要正则表达式,下面我简单介绍一下BeautifulSoup安装和使用,实验环境win10+python36+pycharm50,主要内容如下:
1安装bs4,这里直接在cmd窗口输入命令“pipinstallbs4”就行,如下,很快就能安装完毕:
2安装成功后,我们就可以进行测试了,为了更好地说明问题,这里假设爬取的数据如下,内容比较简单:
对应的网页源码结构如下:
根据网页结构,解析代码如下,这里我是本地打开html文件,爬虫的话,直接使用requests请求对应的页面(requestsget(url)),解析的方式是一样的:
程序运行截图如下,已经成功获取到数据:
至此,我们就完成了利用BeautifulSoup来解析网页内容,整个过程不需要正则表达式。总的来说,这种方式很简单,对于常见的简单的页面来说,完全够用了(不过,正则表达式的使用范围比较广,建议还是认真学习一下),网上也有相关教程和资料,感兴趣的可以搜一下,希望以上分享的内容能对你有所帮助吧。
一、什么是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()
所有的努力都值得期许,每一份梦想都应该灌溉!
首先我们要清晰一点是,所有的网页我们能看到的不管是文字还是还是动画,都是以html标记的,然后浏览器把这些标记可视化的美观的展示给我们,如果我们要做网络爬虫,那么我们的爬虫是没有视觉的,只有逻辑,在爬虫眼里只有html标签,其他的样式在爬虫眼里都是浮云,所以爬虫其实就是读取html标签(这里涉及一个知识点就是要能得到html标签,需要用到一个库是request库,通过网络请求拿到html元素),然后把html标签中自己想要的东西给提取出来,这个就是一个网络爬虫了。逻辑就这么简单。如果有python使用经验的,建议使用爬虫框架scrapy
举一个例子来类比一下,在每日的新冠核酸排查时,发现了几个阳性人员(种子地址),这时候会对每个阳性人员接触的人员(地址内容)进行排查,对排查出的阳性人员再进行上面的接触人员排查,层层排查,直到排查出所有阳性人员。
python网络爬虫跟上面的例子很相似,
首先一批种子地址开始,将这些种子地址加入待处理的任务队列;任务处理者从上面的任务队列中取出一个地址,取出后需要将这个地址从任务队列中移除,同时还要加到已处理地址字典中去,访问地址获取数据;处理上面获取的数据,比如可能是一个网页,网页中又可能存在多个地址,比如一个页面中又很多链接地址,将这些地址如果不在已处理的地址字典的话,就加入到待处理的任务队列。同时提取获取到的数据中的有用部分存储下来;周而复始地执行上面2,3步 *** 作,直到待处理地址队列处理完,或者获取了到了足够数量的数据等结束条件。最后对采集到的有用数据就可以进行清洗,转化处理,作为爬虫的最后数据输出。
利用Python多线程爬了5000多部最新**下载链接,废话不多说~
让我们愉快地开始吧~
Python版本: 364
相关模块:
requests模块;
re模块;
csv模块;
以及一些Python自带的模块。
安装Python并添加到环境变量,pip安装需要的相关模块即可。
拿到链接之后,接下来就是继续访问这些链接,然后拿到**的下载链接
但是这里还是有很多的小细节,例如我们需要拿到**的总页数,其次这么多的页面,一个线程不知道要跑到什么时候,所以我们首先先拿到总页码,然后用多线程来进行任务的分配
我们首先先拿到总页码,然后用多线程来进行任务的分配
总页数其实我们用re正则来获取
爬取的内容存取到csv,也可以写个函数来存取
开启4个进程来下载链接
您学废了吗?最后祝大家天天进步!!学习Python最重要的就是心态。我们在学习过程中必然会遇到很多难题,可能自己想破脑袋都无法解决。这都是正常的,千万别急着否定自己,怀疑自己。如果大家在刚开始学习中遇到困难,想找一个python学习交流环境,可以加入我们,领取学习资料,一起讨论,会节约很多时间,减少很多遇到的难题。
经过前面四章的学习,我们已经可以使用Requests库、Beautiful Soup库和Re库,编写基本的Python爬虫程序了。那么这一章就来学习一个专业的网络爬虫框架--Scrapy。没错,是框架,而不是像前面介绍的函数功能库。
Scrapy是一个快速、功能强大的网络爬虫框架。
可能大家还不太了解什么是框架,爬虫框架其实是实现爬虫功能的一个软件结构和功能组件的集合。
简而言之, Scrapy就是一个爬虫程序的半成品,可以帮助用户实现专业的网络爬虫。
使用Scrapy框架,不需要你编写大量的代码,Scrapy已经把大部分工作都做好了,允许你调用几句代码便自动生成爬虫程序,可以节省大量的时间。
当然,框架所生成的代码基本是一致的,如果遇到一些特定的爬虫任务时,就不如自己使用Requests库搭建来的方便了。
PyCharm安装
测试安装:
出现框架版本说明安装成功。
掌握Scrapy爬虫框架的结构是使用好Scrapy的重中之重!
先上图:
整个结构可以简单地概括为: “5+2”结构和3条数据流
5个主要模块(及功能):
(1)控制所有模块之间的数据流。
(2)可以根据条件触发事件。
(1)根据请求下载网页。
(1)对所有爬取请求进行调度管理。
(1)解析DOWNLOADER返回的响应--response。
(2)产生爬取项--scraped item。
(3)产生额外的爬取请求--request。
(1)以流水线方式处理SPIDER产生的爬取项。
(2)由一组 *** 作顺序组成,类似流水线,每个 *** 作是一个ITEM PIPELINES类型。
(3)清理、检查和查重爬取项中的HTML数据并将数据存储到数据库中。
2个中间键:
(1)对Engine、Scheduler、Downloader之间进行用户可配置的控制。
(2)修改、丢弃、新增请求或响应。
(1)对请求和爬取项进行再处理。
(2)修改、丢弃、新增请求或爬取项。
3条数据流:
(1):图中数字 1-2
1:Engine从Spider处获得爬取请求--request。
2:Engine将爬取请求转发给Scheduler,用于调度。
(2):图中数字 3-4-5-6
3:Engine从Scheduler处获得下一个要爬取的请求。
4:Engine将爬取请求通过中间件发送给Downloader。
5:爬取网页后,Downloader形成响应--response,通过中间件发送给Engine。
6:Engine将收到的响应通过中间件发送给Spider处理。
(3):图中数字 7-8-9
7:Spider处理响应后产生爬取项--scraped item。
8:Engine将爬取项发送给Item Pipelines。
9:Engine将爬取请求发送给Scheduler。
任务处理流程:从Spider的初始爬取请求开始爬取,Engine控制各模块数据流,不间断从Scheduler处获得爬取请求,直至请求为空,最后到Item Pipelines存储数据结束。
作为用户,只需配置好Scrapy框架的Spider和Item Pipelines,也就是数据流的入口与出口,便可完成一个爬虫程序的搭建。Scrapy提供了简单的爬虫命令语句,帮助用户一键配置剩余文件,那我们便来看看有哪些好用的命令吧。
Scrapy采用命令行创建和运行爬虫
PyCharm打开Terminal,启动Scrapy:
Scrapy基本命令行格式:
具体常用命令如下:
下面用一个例子来学习一下命令的使用:
1建立一个Scrapy爬虫工程,在已启动的Scrapy中继续输入:
执行该命令,系统会在PyCharm的工程文件中自动创建一个工程,命名为pythonDemo。
2产生一个Scrapy爬虫,以教育部网站为例>
为自动提取网页的程序,它为搜索引擎从万维网上下载网页。
网络爬虫为一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索。
扩展资料:
网络爬虫的相关要求规定:
1、由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。
2、按照网页内容目录层次深浅来爬行页面,处于较浅目录层次的页面首先被爬行。 当同一层次中的页面爬行完毕后,爬虫再深入下一层继续爬行。
3、文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能。
参考资料来源:百度百科-网络爬虫
以上就是关于python爬虫有多少种方式只会最简单的正则表达式,还有其他什么工具吗全部的内容,包括:python爬虫有多少种方式只会最简单的正则表达式,还有其他什么工具吗、用python写爬虫程序怎么调用工具包selenium、Python爬链接爬虫怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)