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