鱼C论坛

 找回密码
 立即注册
查看: 2572|回复: 17

[技术交流] python爬虫教程(1)

[复制链接]
发表于 2020-5-24 11:54:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
本帖最后由 xiaosi4081 于 2020-5-29 12:52 编辑

python 爬虫入门教程(1)


1.模块选择
python 爬虫可以用两个模块:urllib 和 requests
在这里,
我们使用 python 程序员都在用的requests模块。
2.开始实例

导入 requests:

requests导入.png

爬取房价数据

我们先新建一个变量 url,它的值就是目标网页网址:


                               
登录/注册后可看大图


再新建一个请求头 headers:


                               
登录/注册后可看大图

然后我们要用 requests 库里的 get,还要新建一个变量 res 去存储结果,代码如下:
  1. res = requests.get(url,headers=headers)
复制代码

图:

                               
登录/注册后可看大图


把结果存储到 txt 文件里,如果直接在 idle 打印出来的话 ...
存储代码如下:
  1. with open("test.txt",'w',encoding='utf-8') as file:
  2.     file.write(res.text)
复制代码

处理好后,运行一遍(Ctrl+f5)
我们来分析一下:


                               
登录/注册后可看大图


发现我们想要的数据在 table 标签里
而 table 标签里面的 class 值为 :"stable"


所以接下来我们使用 “漂亮的” BeautifulSoup 来对网页进行解析

代码如下:
  1. soup = BeautifulSoup(res.text,'lxml')
复制代码


记得还要新建一个变量来存储结果

喂,还要在开头加上这句语句:

  1. from bs4 import BeautifulSoup
复制代码


不然,会报错:

  1.     soup = BeautifulSoup(res.text,'lxml')
  2. NameError: name 'BeautifulSoup' is not defined
复制代码


很常见的错误,不是吗?

咳咳,回到正题

接下来,调用函数 find()

必须的参数:
标签名

可选的参数:
id 值
class 值
...

这里我们只需要两个参数:标签名 、class 值

代码:

  1. stable = soup.find("table",class_ = "stable")
复制代码


ps:注意这里为了不与 class(类) 冲突,才用了 class_

然后我们提取 tr 元素:

  1. target = stable.find_all("tr")
复制代码

接下来就是提取关键数据:
我们要用到一个东西:.next_sibling,
因为我们需要兄弟节点的值,所以用它
这边我们跳过第一行,直接开始第二行的读取:
  1. for each in target:
  2.     if i != 1:
  3.         print(each.td.next_sibling.text)
  4.         print(each.td.next_sibling.next_sibling.text)
  5.     i = i+1
复制代码


效果:
  1. 深圳
  2. 66,213
  3. 北京
  4. 65,281
  5. 上海
  6. 52,804
  7. 厦门
  8. 46,218
  9. 三亚
  10. 34,910
  11. 广州
  12. 32,932
  13. 南京
  14. 30,991
  15. 杭州
  16. 29,064
  17. 福州
  18. 25,435
  19. 天津
  20. 25,433
  21. 宁波
  22. 23,224
  23. 苏州
  24. 23,204
  25. 珠海
  26. 22,833
  27. 温州
  28. 22,190
  29. 青岛
  30. 20,833
  31. 丽水
  32. 19,515
  33. 武汉
  34. 17,517
  35. 合肥
  36. 16,618
  37. 无锡
  38. 16,543
  39. 金华
  40. 16,447
  41. 东莞
  42. 16,130
  43. 济南
  44. 15,842
  45. 南通
  46. 15,826
  47. 大连
  48. 15,589
  49. 舟山
  50. 15,481
  51. 常州
  52. 15,408
  53. 成都
  54. 15,261
  55. 海口
  56. 15,079
  57. 西安
  58. 15,078
  59. 石家庄
  60. 15,034
  61. 台州
  62. 14,579
  63. 衢州
  64. 14,439
  65. 廊坊
  66. 14,141
  67. 郑州
  68. 14,030
  69. 扬州
  70. 13,666
  71. 昆明
  72. 13,454
  73. 南昌
  74. 13,446
  75. 大理
  76. 13,416
  77. 嘉兴
  78. 13,348
  79. 佛山
  80. 12,813
  81. 南宁
  82. 12,737
  83. 莆田
  84. 12,699
  85. 兰州
  86. 12,385
  87. 漳州
  88. 12,368
  89. 绍兴
  90. 12,232
  91. 重庆
  92. 12,182
  93. 唐山
  94. 11,999
  95. 泉州
  96. 11,964
  97. 太原
  98. 11,949
  99. 芜湖
  100. 11,884
复制代码

接下来我们要把数据写入Excel表里
使用openpyxl把数据写入Excel
废话不多说,上代码:
  1. import requests
  2. from bs4 import BeautifulSoup
  3. import openpyxl
  4. url = "https://www.gotohui.com/top/"
  5. headers = {
  6.     'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
  7.     }
  8. res = requests.get(url,headers=headers)
  9. soup = BeautifulSoup(res.text,'lxml')
  10. stable = soup.find("table",class_ = "stable")
  11. target = stable.find_all("tr")
  12. i=1
  13. name=[]
  14. num = []
  15. wb = openpyxl.Workbook()
  16. ws = wb.active
  17. for each in target:
  18.     if i != 1:
  19.         name.append(each.td.next_sibling.text)
  20.         num.append(each.td.next_sibling.next_sibling.text)
  21.     i = i+1
  22. ws.append(["城市","单价(元/㎡)"])
  23. for i in range(0,len(name)-1):
  24.     ws.append([name[i], num[i]])
  25. wb.save("data.xlsx")
复制代码


温馨如xiaosi4081 ,我把数据分享出来: data.zip (5.08 KB, 下载次数: 6, 售价: 5 鱼币)

评分

参与人数 2荣誉 +3 鱼币 +2 收起 理由
KevinHu + 2 + 1
不打工的秘密 + 1 + 1 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-24 12:05:59 | 显示全部楼层
沙发!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-24 12:06:15 | 显示全部楼层
板凳
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-24 12:06:48 | 显示全部楼层

有空啦?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-24 12:47:12 | 显示全部楼层

今天周日呀~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-24 13:30:24 | 显示全部楼层

额。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-24 13:46:38 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-24 21:55:49 | 显示全部楼层
能帮忙。。。画个作业的图吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-25 07:42:02 | 显示全部楼层
chenfu48 发表于 2020-5-24 21:55
能帮忙。。。画个作业的图吗

??????
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-25 09:38:28 | 显示全部楼层
尴尬,画不明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-25 16:53:27 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-25 16:54:08 | 显示全部楼层

我发在微博了,一碗面不知道用turtle怎么画,看了你的挺多教程的。。。https://weibo.com/u/3779694510?f ... 1#_rnd1590396784752
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 11:24:01 | 显示全部楼层
大哥牛逼!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 15:39:23 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-27 16:08:47 | 显示全部楼层
chenfu48 发表于 2020-5-25 16:54
我发在微博了,一碗面不知道用turtle怎么画,看了你的挺多教程的。。。https://weibo.com/u/3779694510?f ...

用turtle的circle
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-7 20:51:15 | 显示全部楼层

老哥有联系方式吗,给个QQ,一个小图,但是太细节了,我用circle还是弄不好,可以帮忙画一下的话,有偿
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-7 21:16:36 | 显示全部楼层
chenfu48 发表于 2020-6-7 20:51
老哥有联系方式吗,给个QQ,一个小图,但是太细节了,我用circle还是弄不好,可以帮忙画一下的话,有偿{: ...

不方便
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-10 17:55:38 | 显示全部楼层
chenfu48 发表于 2020-6-7 20:51
老哥有联系方式吗,给个QQ,一个小图,但是太细节了,我用circle还是弄不好,可以帮忙画一下的话,有偿{: ...

我方便
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-21 14:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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