爬取二手房案例--parsel教学篇(CSS选择器)

打印 上一主题 下一主题

主题 835|帖子 835|积分 2505

@
目录

前言

本文通过一个爬取二手房的案例,来分享另外一种解析数据的方式:解析神器python第三方库parsel库。之所以叫他解析神奇,是因为它支持三种解析方式。
可以通过Xpath,CSS选择器和正则表达式来提取HTML或XML文档中的数据。
导航

parsel的利用

安装parsel

因为它是第三方库,所以必要在终端利用pip install parsel 来安装
  1. pip install parsel
复制代码
创建Selector对象
  1. url="xxx.com"
  2. resp=requests.get(url)
  3. selector=parsel.Selector(resp.text)
复制代码
解析数据

解析数据有CSS选择器,Xpath和正则表达式,下面通过一个例子来分别先容这三种解析方式
  1. <html>
  2. <head>
  3.     <title>Example</title>
  4. </head>
  5. <body>
  6.    
  7.         
  8.             <ul >
  9.                 <li >first item</li>
  10.                 <li ><a target="_blank" href="https://www.cnblogs.com/link2.html">second item</a></li>
  11.                 <li ><a target="_blank" href="https://www.cnblogs.com/link3.html">third item
  12.                 test
  13.                 </a></li>
  14.                 <li ><a target="_blank" href="https://www.cnblogs.com/link4.html">fourth item</a></li>
  15.                 <li ><a target="_blank" href="https://www.cnblogs.com/link5.html">fifth item</a></li>
  16.             </ul>
  17.         
  18.    
  19. </html>
复制代码
CSS选择器
  1. # get()和get_all()区别
  2. ## get():用于从通过选择器定位到的元素中提取第一个匹配项的文本内容或属性值,返回的是字符串。
  3. ## get_all():用于通过选择器定位到的元素中提取所有匹配项的文本内容或属性值,返回的是列表
  4. # 标签选择器
  5. res = selector.css(tagName)
  6. # 例如:提取所有li标签中的文字
  7. li_data = selector.css("li::text").getall()
  8. # class选择器
  9. res = selector.css(tagName.className)
  10. # 例如 提取class为item-1的li标签的内容
  11. li_data = selector.css("li.item-1::text").get()
  12. # id选择器
  13. res = selector.css(tagName#idName)
  14. # 例如:提取id为container的div标签的内容
  15. li_data = selector.css("div#container::text").get()
  16. # 属性提取器
  17. res = selector.css(tagName::attr(attrName))
  18. # 例如:提取class为item-1的li标签中的href属性
  19. res = selector.css("li.item-1::attr(href)").get()
  20. # 后代选择器(如div p)
  21. # 例如:选择id为container的div标签下的所有span标签的内容
  22. res = selector.css("div#container span::text").get()
  23. # 子选择器(如div > p)
  24. # 例如:选择id为container的div标签下的所有span标签的内容(和上面不同的是这个标签必须在div的直接子代)
  25. res = selector.css("div#container>span::text").get()
  26. # 嵌套选择器
  27. # 例如:提取 class为item-0 li标签内的id为bold的span标签的内容
  28. res = selector.css("li.item-0 span#bold::text").get()
  29. # 伪类选择器
  30. # 例如:选择父级元素ul下的第二个li标签直接子代的内容
  31. res = selector.css('ul>li:nth-child(2)::text').get()
复制代码
Xpath

敬请下篇
正则表达式

敬请下篇
下面通过一个爬取二手房安居客的实例来更深入的了解css选择器的用法吧
爬取安居客二手房实例
  1. import requests # 数据请求模块
  2. import parsel # 数据解析库
  3. import csv  # 存储到表格中
  4. import os  # 文件管理模块
  5. with open("house.csv", 'wb') as f:
  6.     f = open('house.csv', mode='a', encoding='utf-8', newline='')
  7.     csv_writer = csv.DictWriter(f, fieldnames=["小区名", "小区区域", "小区户型", "小区面积", "均价"
  8.                                                ])
  9. csv_writer.writeheader()
  10. # 目标网站:安居客二手房网站
  11. url="https://wuhan.anjuke.com/sale/hongshana/"
  12. headers={
  13.     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
  14.     "Cookie":"xxx"
  15. }
  16. # Cookie可以通过F12键 查看网络数据包,请求标头中。 如下面
  17. response = requests.get(url=url, headers=headers)
  18. # 实例化对象
  19. selector = parsel.Selector(response.text)
  20. # 爬取十页
  21. for  num in range(1,11):
  22.     url=f'https://wuhan.anjuke.com/sale/hongshana/p2/https://wuhan.anjuke.com/sale/hongshana/p{num}/'
  23.     print(f"正在抓取:第{num}页")
  24.     # class选择器
  25.     res_all=selector.css('div .property')
  26.     for res in res_all:
  27.         community=res.css('p.property-content-info-comm-name::text').get()
  28.         community_address=res.css("p.property-content-info-comm-address span::text").getall()
  29.         community_address="".join(community_address)
  30.         community_house=res.css('div.property-content-info p.property-content-info-text  span::text').getall()
  31.         community_house="".join(community_house)
  32.         community_area = res.css('div.property-content-info p:nth-child(2)::text').get().strip()
  33.         community_area = "".join(community_area)
  34.         community_average=res.css('p.property-price-average::text').get().strip()
  35.         print("小区名:",community,"小区区域:",community_address,"小区户型:",community_house,"小区面积:",community_area,"均价",community_average)
  36.         dic = {
  37.             '小区名': community,
  38.             '小区区域': community_address,
  39.             '小区户型':community_house,
  40.             '小区面积': community_area,
  41.             '均价': community_average
  42.         }
  43.         # 写入表格
  44.         csv_writer.writerow(dic)
复制代码
这里找Cookie

运行截图



共勉

财富是对认知的赔偿,不是对勤劳的夸奖。
博客


  • 本人是一个渗透爱好者,不时会在微信公众号(laity的渗透测试之路)更新一些实战渗透的实战案例,感爱好的同学可以关注一下,大家一起进步。
  • 之前在公众号发布了一个kali破解WiFi的文章,感爱好的同学可以去看一下,在b站(up主:laity1717)也发布了相应的教学视频

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表