您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > AI人工智能 > 第8次课-Python爬虫
使用Python编写网络爬虫•什么是网络爬虫•网页结构•准备工作•使用requests库获取网页源代码•使用正则表达式实现翻页功能•使用Xpath进行页面定位•使用chromedriver进行模拟浏览器操作•百度贴吧爬虫进阶实例•使用chromedriver爬取微信公众号文章•总结•什么是网络爬虫网络爬虫(WebSpider),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。它可以通过程序设计来获取指定网页中的指定信息,如百度贴吧的帖子信息,新闻网站的新闻文章等等。获取到的数据多用于大数据分析场景,因此编写网络爬虫是从事大数据分析行业的必备技能之一。•网页结构在编写网络爬虫之前,首先要对网页结构有一定的了解。大多数网页使用HTML(超文本标记语言)进行编写,通过获取网页源代码,我们就可以看到这个页面的HTML信息。下面以Chrome浏览器为例,介绍查看网页源代码的方法:如图所示,打开一个网页,右键单击空白处,在右键菜单中有一个查看源代码选项,通过点击查看源代码,我们就可以看到这个页面的HTML代码。•网页结构浏览器会在新打开的标签页中显示该网页的源代码,此时我们就会发现,比如我们想要获取这个页面所有帖子的题目,都可以在网页源代码中找到。而网络爬虫的主要工作原理,就是在网页源代码中把我们想要的内容抽取出来。HTML语言中是通过不同的标签来编写网页的,不同的标签对应着网页中不同的元素,有些标签之间可以嵌套,有些标签通过class属性来指定自己的类别,有些标签通过id属性来唯一标示自己,常用的有:div标签,用来标定一块区域;p标签,用于显示一段文字;h1h2h3等标签,用于显示一个标题;a标签,用于放置一个链接。了解了这些,就可以开始制作我们的网页爬虫了。下面的内容将通过百度贴吧爬虫的实例进行同步讲解。requests库•requests的最大优点是程序编写过程更接近正常URL访问过程。requests库是一个简洁且简单的处理HTTP请求的第三方库。•request库支持非常丰富的链接访问功能,包括:•国际域名和URL获取、•HTTP长连接和连接缓存、•HTTP会话和Cookie保持、•浏览器使用风格的SSL验证、•基本的摘要认证、•有效的键值对Cookie记录、•自动解压缩、•自动内容解码、•文件分块上传、•HTTP(S)代理功能、•连接超时处理、•流数据下载等。•有关requests库的更多介绍请访问:•‐requests.orgrequests库中的网页请求函数lxml库、selenium库、re库•BeautifulSoup和Lxml是两个非常流行的python模块,他们常被用来对抓取到的网页进行解析,以便进一步抓取的进行。•selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。•re库:正则表达式(通项公式)是用来简洁表达一组字符串的表达式。字符串匹配。•准备工作使用Python制作网页爬虫,需要预先安装requests库、lxml库、selenium库,re库,并下载chromedriver.exe。安装方法:1)找到Python的安装目录。2)进入Scripts文件夹。3)按住键盘Shift键右键文件夹空白处,选择“在此处打开命令窗口”。安装方法:4)在命令窗口中输入:pip3installrequests,然后等待安装完成提示。5)requests库安装完成后,再输入:pip3installlxml,等待安装完成。6)lxml库安装完成后,再输入:pip3installselenium,等待安装完成。7)re库为正则表达式库,一般Python中自带,若程序运行时提示没有re库,则以同样的方法在命令窗口中输入:pip3installre,即可完成安装。•准备工作•准备工作安装方法:8)打开网页选择chromedriver_win32.zip进行下载,下载完成后解压出chromedriver.exe文件。和python源文件放到一个文件夹下•准备工作在建立好的myspider.py文件中,首先将我们需要用到的库导入,代码如下:importrequestsimportrefromlxmlimportetree其中,fromlxmlimportetree表示在lxml库中单独导入etree部分功能,etree将用于后面使用Xpath进行定位的功能。至此,准备工作完成。•使用requests库获取网页源代码在编写网页爬虫时,需要制定一个url作为爬取的起始点,首先,我们进入中国石油大学的百度贴吧,为了后面方便实现翻页功能,我们点击下一页进入贴吧的第二页,然后复制地址栏中的url:=%E4%B8%AD%E5%9B%BD%E7%9F%B3%E6%B2%B9%E5%A4%A7%E5%AD%A6&ie=utf-8&pn=50在myspider.py文件中,创建一个变量名为url,并把复制的url赋值给这个变量。然后创建一个变量名为html,将获取到的网页源代码保存在这个变量中,通过输出html.text就可以查看到我们所获取到的网页源代码。url='=%E4%B8%AD%E5%9B%BD%E7%9F%B3%E6%B2%B9%E5%A4%A7%E5%AD%A6&ie=utf-8&pn=50’html=requests.get(url)print(html.text)•使用正则表达式实现翻页功能正则表达式是使用一些列特定的符号来表示字符串的一种表达式,正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。接下来将结合实例来演示正则表达式的作用以及使用方法。首先我们来分析我们复制的url,在url末尾,我们可以看到&pn=50字段,通过在网页中点击下一页就可以发现,&pn的数值为当前页面数减去1再乘以50,如第5页时url中&pn=200,除了&pn的值,其它的内容完全不变。当我们在地址栏中修改&pn的值为0时,按下回车,就会发现跳转到了中国石油大学贴吧的第一页。因此,我们可以通过修改&pn的值来实现翻页功能,即获取每一页的网页源代码。•使用正则表达式实现翻页功能foriinrange(10):new_url=re.sub('&pn=\d+','&pn=%d'%(i*50),url)print(new_url)html=requests.get(new_url)re.sub()用于替换字符串中的匹配项。•第一个参数为正则表达式,&pn=\d+表示获取文本中’&pn=’字段后面的多个数字部分,’\d’表示一个数字字符,加号表示连续出现多次;•第二个参数表示将文本中’&pn=’字段后面数字的值替换成i*50;•第三个参数表示把url变量中的文本作为处理文本。通过输出new_url,我们就可以看到贴吧中第1页到第10页的url了,可以通过设置range的范围来获取更多页数的url。获取到每一页的url后,我们就可以再次使用requests.get()方法来获取网页源代码了。•使用Xpath进行页面定位Xpath是一种针对xml文本的快速标记语言,就像现实生活中描述家庭地址一样,精准高效,通过Xpath我们可以快速在网页源代码中找到我们想要的所有内容。这里我们欲获取贴吧中每一页的帖子标题,我们首先使用检查的方法分析网页源代码。右键网页的空白处,选择“检查”。•使用Xpath进行页面定位然后就可以打开开发者工具,如图所示。•使用Xpath进行页面定位通过点开每一层标签以及鼠标在代码上的移动,左侧对应的部分会用蓝底显示,最终我们找到第二个帖子(第一个帖子是置顶贴,我们不予考虑)标题所在的位置。•使用Xpath进行页面定位通过分析我们可以看到,每个帖子的题目内容在a标签中,而a标签的上层为一个class属性为“threadlist_titlepull_leftj_th_tit”的div标签中,因此,我们只要找到所有class属性等于“threadlist_titlepull_leftj_th_tit”的div标签下的a标签的文字内容即可。我们定义一个xpath变量,并赋值。注意threadlist_titlepull_leftj_th_tit末尾有一个空格。•使用Xpath进行页面定位xpath='//*[@class=threadlist_titlepull_leftj_th_tit]/a/text()’pages=etree.HTML(html.content)title=pages.xpath(xpath)//*表示xpath表达式的开始,[@class=”threadlist_titlepull_leftj_th_tit”]表示求class属性等于“threadlist_titlepull_leftj_th_tit”的标签,/a表示该标签下的a标签,/text()表示获取a标签的文本信息。然后我们将获取到的网页源代码转换成etree类型,并且使用xpath进行定位。由于一个页面中有多个标题,符合要求的div标签也有多个,因此pages.xpath()方法返回值为一个列表保存在title变量中,通过循环输出title列表中的内容,我们就可以获取指定页码的贴吧中所有的帖子题目。foreachintitle:print(each)importrequestsimportrefromlxmlimportetreeurl='=%E4%B8%AD%E5%9B%BD%E7%9F%B3%E6%B2%B9%E5%A4%A7%E5%AD%A6&ie=utf-8&pn=50'html=requests.get(url)foriinrange(0,10):new_url=re.sub('&pn=\d+','&pn=%d'%(i*50),url)html=requests.get(new_url)xpath='//*[@class=threadlist_titlepull_leftj_th_tit]/a/text()'pages=etree.HTML(html.content)title=pages.xpath(xpath)foreachintitle:print(each)•完整代码•输出样例同样的,我们可以找到其他内容的Xpath信息,比如发帖人,发帖时间,帖子链接等等,这样就可以使用pages.xpath()方法爬取更多的信息。•使用chromedriver模拟浏览器操作有些页面有一些隐藏信息,是动态加载的,比如单击页面上的某一个按钮才会显示,这样的内容直接获取网页源代码是无法到隐藏内容的源代码的,因此我们需要使用特殊的方法去模拟点击事件的发生,然后再使用Xpath对显示出来的隐藏内容进行定位。我们使用chromedriver来实现模拟点击的功能,chromedriver是一款针对chrome浏览器的自动检测程序,使用chromedriver我们就可以代码实现对网页的各种操作,如点击事件、填写表单等等。隐藏工具栏•使用chromedriver模拟浏览器操作selenium是一套完整的web应用程序测试系统.selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。SeleniumWebDriver提供了各种语言环境的API来支持更多控制权和编写符合标准软件开发实践的应用程序。fromseleniumimportwebdriverdriver=webdriver.Chrome()url='=%E4%B8%AD%E5%9
本文标题:第8次课-Python爬虫
链接地址:https://www.777doc.com/doc-1370065 .html