在使用Python本爬虫采集数据时,一个很重要的操作就是如何从请求到的网页中提取数据,而正确定位想要的数据又是第一步操作。
创新互联公司是一家集网站建设,剑阁企业网站建设,剑阁品牌网站建设,网站定制,剑阁网站建设报价,网络营销,网络优化,剑阁网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
本文将对比几种 Python 爬虫中比较常用的定位网页元素的方式供大家学习:
参考网页是当当网图书畅销总榜:
http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1
我们以获取第一页 20 本书的书名为例。先确定网站没有设置反爬措施,是否能直接返回待解析的内容:
- import requests
- url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
- response = requests.get(url).text
- print(response)
仔细检查后发现需要的数据都在返回内容中,说明不需要特别考虑反爬举措
审查网页元素后可以发现,书目信息都包含在 li 中,从属于 class 为 bang_list clearfix bang_list_mode 的 ul 中
进一步审查也可以发现书名在的相应位置,这是多种解析方法的重要基础
1. 传统 BeautifulSoup 操作
经典的 BeautifulSoup 方法借助 from bs4 import BeautifulSoup,然后通过 soup = BeautifulSoup(html, "lxml") 将文本转换为特定规范的结构,利用 find 系列方法进行解析,代码如下:
- import requests
- from bs4 import BeautifulSoup
- url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
- response = requests.get(url).text
- def bs_for_parse(response):
- soup = BeautifulSoup(response, "lxml")
- li_list = soup.find('ul', class_='bang_list clearfix bang_list_mode').find_all('li') # 锁定ul后获取20个li
- for li in li_list:
- title = li.find('div', class_='name').find('a')['title'] # 逐个解析获取书名
- print(title)
- if __name__ == '__main__':
- bs_for_parse(response)
成功获取了 20 个书名,有些书面显得冗长可以通过正则或者其他字符串方法处理,本文不作详细介绍
2. 基于 BeautifulSoup 的 CSS 选择器
这种方法实际上就是 PyQuery 中 CSS 选择器在其他模块的迁移使用,用法是类似的。关于 CSS 选择器详细语法可以参考:http://www.w3school.com.cn/cssref/css_selectors.asp由于是基于 BeautifulSoup 所以导入的模块以及文本结构转换都是一致的:
- import requests
- from bs4 import BeautifulSoup
- url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
- response = requests.get(url).text
- def css_for_parse(response):
- soup = BeautifulSoup(response, "lxml")
- print(soup)
- if __name__ == '__main__':
- css_for_parse(response)
然后就是通过 soup.select 辅以特定的 CSS 语法获取特定内容,基础依旧是对元素的认真审查分析:
- import requests
- from bs4 import BeautifulSoup
- from lxml import html
- url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
- response = requests.get(url).text
- def css_for_parse(response):
- soup = BeautifulSoup(response, "lxml")
- li_list = soup.select('ul.bang_list.clearfix.bang_list_mode > li')
- for li in li_list:
- title = li.select('div.name > a')[0]['title']
- print(title)
- if __name__ == '__main__':
- css_for_parse(response)
3. XPath
XPath 即为 XML 路径语言,它是一种用来确定 XML 文档中某部分位置的计算机语言,如果使用 Chrome 浏览器建议安装 XPath Helper 插件,会大大提高写 XPath 的效率。
之前的爬虫文章基本都是基于 XPath,大家相对比较熟悉因此代码直接给出:
- import requests
- from lxml import html
- url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
- response = requests.get(url).text
- def xpath_for_parse(response):
- selector = html.fromstring(response)
- books = selector.xpath("//ul[@class='bang_list clearfix bang_list_mode']/li")
- for book in books:
- title = book.xpath('div[@class="name"]/a/@title')[0]
- print(title)
- if __name__ == '__main__':
- xpath_for_parse(response)
4. 正则表达式如果对 HTML 语言不熟悉,那么之前的几种解析方法都会比较吃力。这里也提供一种万能解析大法:正则表达式,只需要关注文本本身有什么特殊构造文法,即可用特定规则获取相应内容。依赖的模块是 re
首先重新观察直接返回的内容中,需要的文字前后有什么特殊:
- import requests
- import re
- url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
- response = requests.get(url).text
- print(response)
观察几个数目相信就有答案了:
书名就藏在上面的字符串中,蕴含的网址链接中末尾的数字会随着书名而改变。
分析到这里正则表达式就可以写出来了:
- import requests
- import re
- url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
- response = requests.get(url).text
- def re_for_parse(response):
- reg = '
'- for title in re.findall(reg, response):
- print(title)
- if __name__ == '__main__':
- re_for_parse(response)
可以发现正则写法是最简单的,但是需要对于正则规则非常熟练。所谓正则大法好!
当然,不论哪种方法都有它所适用的场景,在真实操作中我们也需要在分析网页结构来判断如何高效的定位元素,最后附上本文介绍的四种方法的完整代码,大家可以自行操作一下来加深体会
- import requests
- from bs4 import BeautifulSoup
- from lxml import html
- import re
- url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
- response = requests.get(url).text
- def bs_for_parse(response):
- soup = BeautifulSoup(response, "lxml")
- li_list = soup.find('ul', class_='bang_list clearfix bang_list_mode').find_all('li')
- for li in li_list:
- title = li.find('div', class_='name').find('a')['title']
- print(title)
- def css_for_parse(response):
- soup = BeautifulSoup(response, "lxml")
- li_list = soup.select('ul.bang_list.clearfix.bang_list_mode > li')
- for li in li_list:
- title = li.select('div.name > a')[0]['title']
- print(title)
- def xpath_for_parse(response):
- selector = html.fromstring(response)
- books = selector.xpath("//ul[@class='bang_list clearfix bang_list_mode']/li")
- for book in books:
- title = book.xpath('div[@class="name"]/a/@title')[0]
- print(title)
- def re_for_parse(response):
- reg = '
'- for title in re.findall(reg, response):
- print(title)
- if __name__ == '__main__':
- # bs_for_parse(response)
- # css_for_parse(response)
- # xpath_for_parse(response)
- re_for_parse(response)
本文题目:四种Python爬虫常用的定位元素方法对比,你偏爱哪一款?
网址分享:http://www.mswzjz.cn/qtweb/news19/540769.html攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能
- Lubuntu19.04发布,LXQt桌面环境
- windows7一直不激活会有什么后果?(如果不激活windows7)
- 请问高手:我的网站为什么电信用户可以访问,而联通用户却不可以访问?(在电信宽带电信联通都没有问题)
- c语言怎么学呀
- 学习广域网模拟器Linux,提升网络技术实战能力 (广域网模拟器 linux)
- Gartner:亚太安全市场年增28%五大厂商占半壁江山
- MySQL root 密码破解好用方案介绍
- mongodb时间查询
- 通过配置虚链路解决OSPF非骨干区域网络不通的问题
- 云上智能驾驶三维重建优秀实践
- 长春域名怎么注册,长春域名的应用场景及价值
- CentOS6.5安装及简单配置Nginx
- linux重启mysql失败怎么办
- windows工作区关闭快捷键?windowslnk工作区退出
- 视觉智能平台这个返回的数据,可以只要这个白色的外轮廓坐标吗?