版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章数据预处理:采集网络信息5.1爬虫基础知识5.1.1认识网页源代码5.1.2正则表达式
目录5.2爬虫基础方式5.3爬虫处理方法5.3.1处理数据乱码5.3.2数据清洗与筛选5.3.3生成数据文本文件5.3.4批量爬取多家公司多页资讯5.3.5基础爬虫实践5.3.6Python与MySQL的交互实践5.2.1提取搜狗资讯标题、网址、日期、来源5.2.2post请求获得百度翻译结果5.2.3Selenium库详解5.2.4BeautifulSoup库详解5.1.1认识网页源代码右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.1认识网页源代码以谷歌浏览器为例:按F12后选择Elements选项或鼠标右击后点击“查看网页源代码”即可查看网页源代码按F12打开的开发者面板中,左上角有一个光标形状的按钮,点击使其变蓝后可以将鼠标移到目标元素上查看对应的网页源代码右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.1认识网页源代码如上图所示,网页源代码中被阴影覆盖的部分就是网页中选中内容的网页源代码右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.1认识网页源代码不难发现,在网页源代码左侧有许多的三角箭头,点击三角箭头即可展开内容,看见折叠的信息,这就是网页源代码的嵌套结构右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.1认识网页源代码改变网页源代码文本框中的内容,网页上的内容也会发生改变。如上图中,删掉网页源代码中的“淘宝网”,网页中的“淘宝网”也消失了。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.1认识网页源代码当使用右击菜单点击“查看网页源代码”选项时,我们可以在一个新的标签页看到当前网页的源代码,这些是我们通过Python能够爬取的信息。通过快捷键Ctrl+F可以对源代码进行搜索,查找自己需要的信息。不过有一些通过F12键看到的内容却不会出现在这里,这是因为F12键所看到的网页源代码是经过浏览器渲染过的,如股价,天气预报等动态信息不会固定地写在网页源代码中。5.1.2正则表达式右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.2正则表达式正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式作为非常好用的信息提取工具,可以灵活、高效地提取文本中的所需信息右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.2正则表达式findall()函数正则表达式需要使用findall()函数,它的作用是在原始文本中提取所有符合匹配规则的文本内容。下面是findall()函数的范例:importrea='123abc学爬虫'b=re.findall('\d',a)print(b)右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.2正则表达式‘\d’是一种特殊的符号,代表匹配一个数字,逗号后面的a代表原始文本,所以这行代码就是用findall()函数寻找第二行匹配范围a中出现的数字。最终结果如下:如‘\d’这样的特定符号还有很多,下一页的表中是一些常见的特定符号b=re.findall('\d',a):右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.2正则表达式特定符号功能\n匹配一个换行符,相当于按一次Enter键\w匹配字母与数字的字符,包含下画线\W匹配除字母与数字以及下画线外的其他字符\s匹配任何空白字符,如换行符、制表符、普通空格等\S匹配非空白字符\d匹配数字字符\D匹配非数字字符\t匹配一个制表符,相当于按一次Tab或八次空格.匹配除了换行符(\n)以外的任何字符?匹配0次或1次前面出现的正则表达式+匹配1次或多次前面出现的正则表达式*匹配0次或多次前面出现的正则表达式^匹配字符串的起始部分$匹配字符串的终止部分()匹配括号内的表达式,也表示一个组右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.2正则表达式贪婪匹配和非贪婪匹配上一页的表中的特定符号可以组合成无数种匹配规则,但一般我们只需要用到“.*?”和‘“(.*?)”这两种组合。“.*”是一种名为贪婪匹配的组合,这是因为它所匹配的范围太大了,常常会匹配到过多内容。贪婪匹配如果加上“?”变成“.*?”,就是非贪婪匹配,这时它就能比较精准地匹配到我们所需要的内容了。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.2正则表达式非贪婪匹配非贪婪匹配有两种:(.*?)和.*?(.*?)的作用是代替我们希望爬取的内容,并不需要知道内容的具体长度和格式,但需要知道其前后代码分别是什么。另一种非贪婪匹配“.*?”的作用是代替匹配规则中的内容,包括空格和换行符。因为实战中目标代码两端的代码可能是不固定的或没有规律的,无法写到匹配规则中,或是两端的代码太多,不想全部写到匹配规则中。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.2正则表达式(.*?)范例importrea='开头123abc学爬虫结尾'p_a='开头(.*?)结尾'#匹配规则b=re.findall(p_a,a)print(b)结果:右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.2正则表达式.*?范例importrea='<href=><title=新闻标题>'p_a='<href=.*?><title=(.*?)>'b=re.findall(p_a,a)print(b)结果:注意:因为目标是提取新闻标题,所以对于可能变化的网址使用了“.*?”代替,而目标新闻标题则使用“(.*?)”提取。结果如图右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.1.2正则表达式修饰符实战中的网页源代码存在很多换行,而非贪婪匹配无法自动匹配换行,所以遇到换行就不会继续匹配换行后的内容了,此时需要用到修饰符“re.S”
。它的作用是在使用findall()函数时可以自动考虑换行符,让非贪婪匹配不受换行符影响,使用格式如下:title=re.findall(p_title,res,re.S)5.2.1提取搜狗资讯标题、网址、日期、来源右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.1提取搜狗资讯标题、网址、日期、来源搜狗搜索引擎作为比较常见的搜索引擎,我们可以在搜狗资讯中爬取到许多有用的新闻信息。以爬取搜狗资讯中关于腾讯的新闻信息为例,在搜狗上搜索“腾讯”并点击搜索栏下的资讯板块。来到目标网页之后,我们需要查看并获取网页源代码。在Python中,这一步可以通过导入Request库完成。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.1提取搜狗资讯标题、网址、日期、来源importrequestsheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/92.0.4515.107Safari/537.36'}url='/sogou?query=腾讯&interation=1728053249'response=requests.get(url,headers=headers).text注意:“headers=……”是为了设置headers参数,提供网站访问者信息,其中的‘User-Agent’(用户代理)表示是用什么浏览器访问的。以谷歌浏览器为例,打开谷歌浏览器后,在地址栏输入“about:version”,按下回车后可以在界面中找到用户代理一项,后面的字符串就是‘User-Agent’后的内容。“response=……”是为了通过Request库的get()函数访问目标网址,并用“.text”
获取网页源代码的文本内容。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.1提取搜狗资讯标题、网址、日期、来源应用正则表达式在获得网页源代码后,是爬虫的关键步骤。我们需要寻找网页源代码中,关于目标内容的统一特征,以此来应用正则表达式。例如爬取新闻标题时,我们需要多次选择不同标题,查看不同标题附近的网页源代码,总结其中的规律,最终得到可以匹配目标内容的正则表达式规则。5.2.1提取搜狗资讯标题、网址、日期、来源例如,在爬取网址时,我们选择前三个标题,获得了在网页源代码中前三个标题的网址及其附近的网页源代码。通过观察我们可以得出下面的正则表达式:p_href='<h3class="vr-title">.*?<aid=.*?href="(.*?)">.*?</a>'这就是一个可以广泛而又准确匹配目标网址的正则表达式,如果匹配不准确可以扩充正则表达式内容,使其指向更精准。5.2.2post请求获得百度翻译结果右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.2post请求获得百度翻译结果除了使用Requests库中的get()函数访问网页网址,还可以使用post()函数访问网页。post()函数是需要携带用户信息的请求方式,它要获取的内容不能单靠网址获得,需要提交一些额外的信息。例如,在翻译网站中,需要提交翻译的原文;在查询某地天气时,可能需要提交城市的名称。提交的信息不同,获得的结果也会产生相应的变化。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.2post请求获得百度翻译结果以查询百度翻译中apple的翻译结果为例:首先需要获得百度翻译的url,post法的url并不能直接使用网页网址:按F12键打开控制台,选择Network选项。Network可以显示所有的请求过程,在需要使用post法的网页中,我们可以查询请求过程中的RequestURL来获得post法的url。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.2post请求获得百度翻译结果然后,可以任意查询一个英文单词,例如apple,注意,这里需要切换成英文输入法:之后如右图,点击右侧的请求过程,找到RequestURL,同时可以看出下面的RequestMethod正是POST:右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.2post请求获得百度翻译结果最后,点击Payload选项,可以看到此处显示的信息为“kw:apple”:右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.2post请求获得百度翻译结果通过这些,我们可以编写出如下代码:importrequestsimportjsonurl='/sug'data={'kw':'apple'}response=requests.post(url,data=data)print(response.json())首先导入Requests库和json模块然后输入url之后在字典中输入我们需要提供的信息,也就是原文“apple”
。最后用post请求获得翻译结果并打印输出注意,最后打印输出时需要使用.json()将结果转化为字典,否则使用.text会出现乱码。5.2.3Selenium库详解右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.3Selenium库详解Selenium库是一个自动化测试工具,能够通过浏览器驱动对浏览器进行操作。利用Selenium库可以获取动态的实时数据,如股票行情实时数据等。这些数据是动态渲染出来的,无法借助正则表达式爬取。这类数据可以通过开发者工具查看,但无法通过鼠标右击选择“查看网页源代码”选项查看右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.3Selenium库详解安装ChromeDriver在使用Selenium库之前,我们要先安装ChromeDriver。ChromeDriver是一个能够被Selenium驱动的模拟浏览器,也是运行Selenium库的前提条件。ChromeDriver的下载与安装方法如下:1.查看谷歌浏览器版本:打开谷歌浏览器,点击右上角菜单,打开帮助中的‘关于GoogleChrome’,即可查看谷歌浏览器版本。ChromeDriver的版本需要和谷歌浏览器的版本对应。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.3Selenium库详解2.下载ChromeDriver
下载ChromeDriver的网址如下:
(第一个是官方网址,第二个是镜像网址)/a//chromedriver/downloads/mirrors/chromedriver/
打开网站后选择与自己浏览器版本一样或相近的版本下载即可3.安装ChromeDriverChromeDriver压缩文件解压到Python安装路径中的Scripts文件夹中。
注意:如果不知道Python安装路径,可以用快捷键Win+R调出“运行”对话框,
然后输入“cmd”打开命令行窗口,最后输入“wherepython”并运行即可获
得Python的安装路径右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.3Selenium库详解4.检查ChromeDriver是否安装成功再次打开命令行窗口,输入‘chromedriver’并运行,显示类似如下的信息即安装成功:右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.3Selenium库详解在安装ChromeDriver并导入Selenium库后就可以学习如何使用Selenium库了。首先学习如何用Selenium库打开网页,相关代码如下:fromseleniumimportwebdriverimporttimebrowser=webdriver.Chrome()#表明模拟谷歌浏览器url='/'browser.get(url)#打开网页#browser.maximize_window()#使浏览器窗口最大化time.sleep(2)browser.quit()#关闭浏览器右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.3Selenium库详解如果希望程序在后台运行,不显示模拟浏览器,可以使用如下代码:fromseleniumimportwebdriver#ChromeHeadless方法chrome_options=webdriver.ChromeOptions()chrome_options.add_argument('--headless')browser=webdriver.Chrome(options=chrome_options)url='/'browser.get(url)注意:第五行括号中的代码(options=chrome_options)是Selenium库3.8版本后推荐的新写法,如果是较低的版本可以写成(chrome_options=chrome_options)。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.3Selenium库详解XPath法和css_selector法Selenium库可以通过XPath方法或者css_selector方法模拟鼠标和键盘的操作,这两种方法都能定位元素的位置。获得元素的XPath或css_selector的方法:1.按F12打开开发者工具,点击左上角的‘选择’按钮,然后选中目标元素,即可获得目标元素对应的网页源代码。2.鼠标右击源代码,执行菜单中的“Copy”->“CopyXPath”命令可以获得目标元素的XPath,如果是css_selector方法就执行菜单中“Copy”->“Copyselector”命令。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.3Selenium库详解操作方法如图:右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.3Selenium库详解以用XPath法在百度搜索‘金融’并爬取对应网页源代码为例:fromseleniumimportwebdriverimporttimebrowser=webdriver.Chrome()url='/'browser.get(url)time.sleep(2)#browser.find_element_by_xpath(‘//*[@id=“kw”]’).clear()#清除搜索栏的原有内容browser.find_element_by_xpath('//*[@id="kw"]').send_keys('金融’)#在搜索栏输入金融browser.find_element_by_xpath('//*[@id="su"]').click()#点击搜索按钮data=browser.page_source#获得网页源代码print(data)右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.3Selenium库详解注意点1.由于使用Selenium库需要模拟浏览器操作,爬取数据的速度较慢,所以在实际应用时要导入time库,在运行代码时设置间隔时间2.css_selector法与XPath法类似,仅需将by_xpath改为by_css_selector并在括号中填入css_selector内容即可3.
Selenium库虽然可以获取Requests库难以获取的动态数据,但因为使用模拟浏览器,所以速度比较慢,因此一般还是使用Requests库。5.2.4BeautifulSoup库详解右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解BeautifulSoup是Python的一个网页解析库,可以提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。BeautifulSoup可以借助网页的结构和属性等特性来解析网页,利用它不用编写正则表达式即可方便地实现网页信息的提取。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解安装库使用BeautifulSoup前需要先安装Beautifulsoup4库和lxml解析器,用正常安装第三方库的方法即可。安装后可以运行如下代码,验证是否安装成功:frombs4importBeautifulSoupsoup=BeautifulSoup('<p>helloworld<\p>','lxml')print(soup.p.string)
结果如图,则安装成功:右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解下面讲解的BeautifulSoup库所用的网页源代码如下所示:html='''<html><head><title>TheDormouse'sstory</title></head><body><pclass="story">Onceuponatimetherewerethreelittlesisters;andtheirnameswere<ahref="/elsie"class="sister"id="link1"><!--Elsie--></a>,<ahref="/lacie"class="sister"id="link2">Lacie</a>and<ahref="/tillie"class=”sister"id="link3">Tillie</a>andtheylivedatthebottomofawell.</p><pclass="story">...</p>'''#网页源代码右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解导入BeatifulSoup库首先要导入BeatifulSoup库,然后将初始化的BeatifulSoup对象赋值给变量soup,代码如下:frombs4importBeautifulSoupsoup=BeautifulSoup(html,'lxml')注意:第二行代码括号中的第一个参数是网页源代码,第二个是解析器类型,这里使用之前安装的lxml解析器。此外,初始化BeatifulSoup对象可以自动更正格式,补齐上面代码中缺失的</html>和</body>。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解BeatifulSoup库基础代码1.如果网页源代码缩进格式不正确,可以用如下的代码将网页源代码以标准的缩进格式输出:print(soup.prettify())右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解2.直接选择节点即可输出节点和节点中的内容,再调用string属性可以输出节点内的文本内容。注意的是,string属性要选择离文本最近的节点,否则会显示None,例如选择title节点的代码如下:print(soup.title)#输出title节点print(soup.title.string)#输出title节点中的文本print(soup.head.string))#选择较远的head节点时结果如图:右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解3.如果有多个相同名称的节点,则选择节点时只会选择第一个节点。如图一的网页源代码,当选择<p>节点时,只会显示第一个<p>节点中的内容图一网页源代码代码及结果如下:print(soup.p)
图二运行结果右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解4.网页源代码是嵌套结构,而BeautifulSoup同样支持用嵌套的方式选择节点。例如<title>节点在<head>节点中,而<head>又在<html>节点中,所以可以用如下代码选择<title>节点及其文本:print(soup.html.head.title)print(soup.html.head.title.string)结果如图:这种方法可以在有多个相同节点时,指定选择需要的节点。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解5.查看节点属性和属性值节点有不同的属性,选择节点后可以用attrs查看该节点的属性,以查看<a>节点属性为例:print(soup.a.attrs)结果如下:右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解attrs也可以用于调用属性值,下面是调用<a>节点class属性值的两种方法:print(soup.a.attrs['class’])#即print(soup.节点.attrs['属性'])print(soup.a['class’])#即print(soup.节点['属性'])输出结果如下:可以看出,这两种方法都获得了<a>节点的<class>属性的值。值得注意的是,属性值的输出结果可能是列表,也可能是字符串,比如调用<a>节点的<id>属性的值时,输出的就是字符串:print(soup.a['id'])右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解6.查找子孙节点Beautifulsoup可以查找一个节点的子孙节点、祖先节点和兄弟节点。查找子孙节点的方式有三种,第一种利用contents属性可以获得直接子节点,以获取<p>节点的直接子节点为例,代码如下:print(soup.p.contents)结果如图:
值得注意的是,contents属性只会显示直接子节点而不会特意标注子孙节点。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解第二种方法是调用children属性来显示直接子节点,同样以获取<p>节点的直接子节点为例,代码如下:fori,childinenumerate(soup.p.children):print(i,child)结果如下:
这种方法获得的网页源代码文本和第一种相同,无法标注子孙节点。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解第三种方法是调用descendants属性,这种方法可以递归查询所有子节点,得到所有子孙节点。以获取<p>节点的子节点与子孙节点为例,代码如下:fori,childinenumerate(soup.p.descendants):
print(i,child)结果如图:右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解7.查找父节点和祖先节点一般可以调用parent属性查找节点的直接父节点,利用parents属性查找节点的祖先节点。获取<title>节点的父节点的代码如下:print(soup.title.parent)结果如图:
右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解获取<title>节点的祖先节点的代码如下:print(list(enumerate(soup.title.parents)))这里用列表输出了祖先节点的索引和内容,结果如下:可以看出,调用parent属性的结果是<title>节点的直接父节点<head>节点;调用parents属性的结果是直接父节点<head>节点以及祖先节点<html>节点和BeautifulSoup对象。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解8.查找兄弟节点兄弟节点是与目标节点平级的节点,一般用next_sibling属性和previous_sibling属性来获取兄弟节点。next_sibling属性可以获得节点的下一个兄弟元素,previous_sibling属性可以获得节点的上一个兄弟元素。如果想获得所有的兄弟节点,可以利用next_siblings属性和previous_siblings属性。以获取<a>节点的兄弟为例,代码如下:print('NextSilbling',soup.a.next_sibling)print('PrevSilbling',soup.a.previous_sibling)print('NextSilblings',list(enumerate(soup.a.next_siblings)))print('PrevSilblings',list(enumerate(soup.a.previous_siblings)))结果依次如图:
下一个兄弟节点:
上一个兄弟节点:
之后所有兄弟节点:
之前所有兄弟节点:右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解9.获取关联节点的信息如果查找关联节点时返回结果是单个节点,那么可以直接调用string、attrs等属性获得其文本和属性;如果返回结果是多个节点的生成器,则可以转为列表后取出某个元素,然后再调用string、attrs等属性获取其对应节点的文本和属性。例如,parent属性可以获得节点的直接父节点,是单个节点,所以可以直接调用string等属性。获得<title>节点的直接父节点的name属性值的代码如下:print()结果如图:右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解获得<a>节点的所有兄弟元素,返回结果是多个节点的生成器,所以要转为列表后取出元素,然后再调用string、attrs等属性。获得<a>节点所有兄弟节点中第二个节点的attrs属性值的代码如下:print(list(soup.a.next_siblings)[1].attrs)结果如下:右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解10.find_all()和find()虽然通过属性来选择目标的方法很快,但并不方便,所以BeatifulSoup还提供了find_all()和find()这两种查询方法。find_all()和find()的区别是find_all()可以查询所有符合条件的目标,而find()只提供第一个匹配到的目标。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解find_all()和find()的使用方法如下:find(name,attrs,recursive,text,kwargs)find_all(name,attrs,recursive,text,kwargs)括号中的是相关的参数。这些参数相当于过滤器一样可以进行筛选处理。不同的参数过滤可以应用到以下情况:1.查找标签,基于name参数2.查找文本,基于text参数3.基于正则表达式的查找4.查找标签的属性,基于attrs参数5.基于函数的查找只需要在括号中输入相应的参数,即可快速精确地查询目标,十分方便快捷。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.2.4BeautifulSoup库详解例如,查询所有的<a>节点,只需要输入如下代码:print(soup.find_all(name='a'))结果如右:如果想要更加精确,可以输入节点的attrs属性。例如获得第二个<a>节点的代码如下:print(soup.find_all(attrs={'id':'link2'}))结果如右:除此以外,也可以通过text参数查找节点的文本,传入的形式可以是字符串,也可以是正则表达式的形式。例如,获得网页源代码中所有含‘story’的文本的代码如下:importre#注意,使用text参数时需要导入re库print(soup.find_all(text=pile('story')))结果如右:5.3.1处理数据乱码右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.3.1处理数据乱码爬取网页的源代码有时候会出现中文变成乱码的情况,这一般是因为通过Python获得的网页源代码的编码方式是ISO-8859-1,而网页实际的编码方式是utf-8或gbk。ISO-8859-1属于单字节编码,应用于英文,无法表达中文字符;而utf-8和gbk都支持中文编码。对于此类问题的解决方法是用encode()函数将字符串转化为二进制字符,再用decode()函数将二进制字符转化为不同编码方式的字符串。具体代码如下:#将ISO-8859-1重新编码为utf-8response=response.encode('ISO-8859-1').decode('utf-8’)#将ISO-8859-1重新编码为gbkresponse=response.encode('ISO-8859-1').decode('gbk’)5.3.2数据清洗与筛选右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.3.2数据清洗与筛选使用正则表达式获得目标内容后,会发现其中包含一些无用信息,格式也比较混乱,这时需要对数据进行清洗。清洗数据一般使用sub()函数和strip()函数。sub()函数可以清洗无关信息,strip()函数可以删除空白字符。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.3.2数据清洗与筛选在清洗或筛选数据时,由于数据量通常较大,所以一般使用for循环语句来批量处理数据并用正则表达式来指代无关信息。示例:如图,在新闻标题中穿插着一些无关信息。经过观察,发现这些无关信息都可以通过正则表达式,用<.*?>来指代,所以清洗数据的代码可以写成:foriinrange(len(title)):
title[i]=title[i].strip()title[i]=re.sub('<.*?>','',title[i])结果如下:右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.3.2数据清洗与筛选数据打印在获得并清洗数据后,我们可以通过for循环来直观简洁地输出数据,示例如下(示例仅供参考):foriinrange(len(title)):
print(str(i+1)+'.'+title[i]+'('+source[i]+'
'+date[i]+')')
print(href[i])注意:由于列表是从0开始的,所以开头的序号应为“i+1”,此外,s输出的代码也应在for循环下右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.3.2数据清洗与筛选用关键词筛选数据通过for循环和if语句,我们可以对新闻的标题和正文进行关键词筛选,只留下包含关键词的新闻。右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.3.2数据清洗与筛选移除新闻标题不包含关键词的新闻#1.标题不含关键词则相关内容全变为空值foriinrange(len(date)):
if'关键词'notintitle[i]:
title[i]=''
source[i]=''
href[i]=''
date[i]=''思路:如果关键词不在新闻标题中,则将此新闻的标题、来源、网址和日期都转化为空,最后批量删除列表中的空元素。#2.删除空值元素while''intitle:title.remove('')while''inhref:href.remove('')while''indate:date.remove('')while''insource:source.remove('')右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.3.2数据清洗与筛选移除正文中不包含关键词的新闻。importtimetry:
article=requests.get(href[i],headers=headers,timeout=10).text#获取新闻正文except:
article='新闻爬取失败'if'关键词'notinarticle:
···········思路:和筛选新闻标题的代码相同,但需要先获得正文内容。通过访问新闻网址来获取网页源代码,为了防止因为程序意外中止或访问超时,这里还可以加上try/except语句并导入time库右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.3.2数据清洗与筛选生成数据文本文件在Python上爬取出新闻的相关信息后,如果想将爬取结果保存在一个文件中,我们可以用Python打开或新建一个文本文件并将数据输入其中。用Python打开或创建一个文本文件并输入内容的代码如下:#括号中第一个是文件路径,‘a’不覆盖文件原内容,‘w’会覆盖文件原内容file=open('D:\\数据文件.txt','a')#打开文件file.write('helloworld')#在打开的文件中输入内容file.close()#关闭文件右键点击图片选择设置图片格式可直接替换图片。您的容打在这里,或者通这里,或者通过复制过复制您的文本5.3.2数据清洗与筛选我们可以使用for循环来将所有新闻信息写入文本文件示例如下(示例仅供参考):file=open('D:\\数据.txt','a')foriinrange(len(title)):
file.write(str(i+1)+'.'+title[i]+'('+source[i]+'
'+date[i]+')'+'\n')
file.write(href[i]+'\n')file.write('—————————————————————'+'\n'+'\n')file.cl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程车包车合同范本
- 店铺委托租赁协议书
- 执行校长合同协议书
- 扶持项目资金协议书
- 扶贫项目实施协议书
- 找保险代偿协议合同
- 承包产品合同协议书
- 承包厕所卫生协议书
- 承包土运输合同协议
- 承包林地消防协议书
- 医生多点执业协议书
- 唑来膦酸注射液-药品临床应用解读
- 两办《意见》培训
- 员工黄赌毒法制培训
- 门诊部管理工作制度(4篇)
- 美的组织管理制度内容
- 广东省2024-2025学年上学期八年级物理第三次月测试卷
- 【MOOC】《中级有机化学》(北京化工大学)章节中国大学慕课答案
- 四川省九市2022级(2025届)高三一诊语文试卷(含答案)
- 南京理工大学紫金学院《数字媒体图像处理》2023-2024学年第一学期期末试卷
- 创伤的诊断与治疗
评论
0/150
提交评论