大家好,我是林大侠。在前言中,可能有人会说,初学者用Python爬虫爬数据太难了。在构造正则表达式的时候,太麻烦了,而且眼花缭乱。而且,他们前一秒还能愉快地爬行,下一秒就会封IP。是的,这还是个屁,别爬了。嘿嘿,别着急,本文我们将教大家如何使用XPath爬取极速代理中的免费代理IP,告别头晕目眩,告别IP被封的烦恼。XPath首先,让我们简单了解一下XPath。想要了解更多关于XPath的知识,我们可以打开W3school官方文档进行详细了解。什么是XPath?XPath即XML路径语言(XMLPathLanguage);XPath使用路径表达式在XML文档中导航;XPath包含一个标准函数库;XPath是XSLT中的主要元素;XPath是W3C标准;它是什么?XPath用于在XML文档中定位部分的语言XPath用于在XML文档中查找信息的语言XPath用于在XML文档中的元素和属性之间导航。XPath有超过100个内置函数。这些函数用于字符串值、数值、日期和时间比较、节点和QName处理、序列处理、逻辑值等。在Python爬虫中,我们可以使用XPath来提取相应的信息。XPath—常用规则简单了解了XPath之后,我们来看一下它的常用规则,如下表所示:简单说一个例子://title[@*]这是一条XPath规则,意思是:选择标题元素的所有属性。好了,现在我们对XPath的常用规则和用法有了一个大概的了解,下面我们来添加一个Chrome浏览器的小插件——XPathHelper。这个小插件可以大大提高我们使用XPath的效率。添加和使用XPathHelper要添加XPathHelper,首先打开Chrome商店,搜索XPathHelper,如下图:点击方框2,将插件添加到Chrome,如下图:这里推荐点击下图中的小图钉,这样我们使用XPathHelper插件就更方便了,这样就添加了XPathHelper插件。接下来,我们将简要演示如何使用该插件。要使用XPathHelper,首先我们打开今天要爬取的快速代理网站,打开开发者工具,找到我们要爬取内容的节点,如下图:然后打开我们添加的插件,进入XPath规则,如下图注:我们是根据表节点信息构建XPath规则,输入XPath规则可以直接看到返回的内容,这样就不用每次都跑程序了我们形成它,看看是否能返回我们想要的值,这大大提高了我们的效率。抓取首页实战演练我们首先打开快手免费代理网站,打开开发者工具,如下图:通过观察,我们可以发现该页面的url最后一位数字为页码,即是我们翻页的重要参数,这里我们使用page变量来帮我们翻页。具体代码如下:headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0。4472.106Safari/537.36'}defget_page(page):url='https://www.kuaidadaili.com/free/inha/'+str(page)response=requests.get(url,headers=headers)#数据类型转换html=parsel.Selector(response.text)parse_page(html)首先我们构造一个请求头,然后定义一个get_page()方法。这里需要注意的是,当我们获取请求页面的文本数据时,必须进行数据类型转换,转换为XPath可以找到信息的HTML文本,即创建一个parsel.Selector对象。转换后,我们调用parse_page()方法,传入html参数。XPath规则抽取内容我们已经成功抽取了网页的HTML文本,接下来我们开始使用XPath规则抽取想要的内容。首先,我们需要确定XPath规则提取内容的范围,如下图所示:从图中我们可以看到表节点包含了我们要提取的内容,然后我们使用XPathHelper插件来方便我们判断是否能够准确提取目标内容,如下图:图中的方框是我们要提取的内容范围,确定范围后,我们确定提取的对应的XPath规则内容,如下图所示:好了,我们已经成功提取IP地址了。经过观察,我们只需要将图中左上角方框内的IP改为PORT即可,这样就可以提取出端口号了,具体实现代码如下:defparse_page(html):#XPath匹配范围parse_list=html.xpath('//table[@class="table-borderedtable-striped"]/tbody/tr')fortrinparse_list:parse_lists={}http=tr.xpath('./td[@data-title="Type"]//text()').extract_first()num=tr.xpath('./td[@data-title="IP"]//text()').extract_first()port=tr.xpath('./td[@data-title="PORT"]//text()').extract_first()parse_lists[http]=num+':'+porttime.sleep(0.1)print(parse_lists)需要注意的是,我们构造XPath规则的时候,比如://td[@data-title="IP"],需要把前面的/to.,否则只匹配页面的第一个内容;在XPath规则中,使用text()方法获取节点内部的文本,如在规则后添加//text();调用extract_first()返回一个字符串characterString是列表数组中的第一个字符串。最后,我们通过构造一个parse_lists字典使我们的数据看起来更好。循环遍历我们使用for循环遍历页面,具体代码为:if__name__=='__main__':forpageinrange(1,3):get_page(page),这样我们就成功爬取了快代理的空闲代理为IP的前两页,我们可以根据需要保存免费代理IP。结果显示
