worker.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. const crawler = require('./crawler')
  2. const { Province, City, Area, Street, Village } = require('./sqlite')
  3. /**
  4. * 抓取所有省级数据
  5. * @author https://github.com/modood
  6. * @datetime 2018-01-31 22:11
  7. */
  8. exports.fetchProvinces = async () => {
  9. const o = await crawler.fetchProvinces()
  10. for (const code in o) {
  11. const name = o[code]
  12. await Province.findOrCreate({
  13. where: { code },
  14. defaults: { code, name }
  15. })
  16. }
  17. }
  18. /**
  19. * 抓取所有地级数据
  20. * @author https://github.com/modood
  21. * @datetime 2018-01-31 22:13
  22. */
  23. exports.fetchCities = async () => {
  24. await exports.fetchProvinces()
  25. let hasNext = true
  26. let after
  27. const limit = 11
  28. while (hasNext) {
  29. const r = await Province.paginate({ limit, after })
  30. for (let i = 0; i < r.results.length; i++) {
  31. const { dataValues: { code: provinceCode } } = r.results[i]
  32. const o = await crawler.fetchCities(provinceCode)
  33. for (const code in o) {
  34. const name = o[code]
  35. await City.findOrCreate({
  36. where: { code },
  37. defaults: { code, name, provinceCode }
  38. })
  39. }
  40. }
  41. hasNext = r.cursors.hasNext
  42. after = r.cursors.after
  43. }
  44. }
  45. /**
  46. * 获取所有县级数据
  47. * @author https://github.com/modood
  48. * @datetime 2018-02-01 09:12
  49. */
  50. exports.fetchAreas = async () => {
  51. await exports.fetchCities()
  52. let hasNext = true
  53. let after
  54. const limit = 10
  55. while (hasNext) {
  56. const r = await City.paginate({ limit, after })
  57. for (let i = 0; i < r.results.length; i++) {
  58. const { dataValues: { code: cityCode, provinceCode } } = r.results[i]
  59. // 特殊处理:广东省中山市(3320)、广东省东莞市(4419)、海南省儋州市(4604)没有县级
  60. if (['4420', '4419', '4604'].includes(cityCode)) continue
  61. const o = await crawler.fetchAreas(cityCode)
  62. for (const code in o) {
  63. const name = o[code]
  64. await Area.findOrCreate({
  65. where: { code },
  66. defaults: { code, name, cityCode, provinceCode }
  67. })
  68. }
  69. }
  70. hasNext = r.cursors.hasNext
  71. after = r.cursors.after
  72. }
  73. }
  74. /**
  75. * 获取所有乡级数据
  76. * @author https://github.com/modood
  77. * @datetime 2018-02-01 09:28
  78. */
  79. exports.fetchStreets = async () => {
  80. await exports.fetchAreas()
  81. let hasNext = true
  82. let after
  83. const limit = 10
  84. while (hasNext) {
  85. const r = await Area.paginate({ limit, after })
  86. for (let i = 0; i < r.results.length; i++) {
  87. const { dataValues: {
  88. name: areaName,
  89. code: areaCode,
  90. cityCode,
  91. provinceCode } } = r.results[i]
  92. // 特殊处理:名为市辖区的县级没有乡级
  93. // 1. 福建省泉州市金门县(350527)也没有乡级
  94. // 2. 甘肃省嘉峪关市下仅一个县级名为市辖区(code: 620201),
  95. // 但是它有乡级,因此也需要特殊处理
  96. if (areaName === '市辖区' || ['350527'].includes(areaCode)) continue
  97. const o = await crawler.fetchStreets(areaCode)
  98. for (const code in o) {
  99. const name = o[code]
  100. await Street.findOrCreate({
  101. where: { code },
  102. defaults: { code, name, areaCode, cityCode, provinceCode }
  103. })
  104. }
  105. }
  106. hasNext = r.cursors.hasNext
  107. after = r.cursors.after
  108. }
  109. }
  110. /**
  111. * 抓取所有村级数据
  112. * @author https://github.com/modood
  113. * @datetime 2018-02-01 09:47
  114. */
  115. exports.fetchVillages = async () => {
  116. await exports.fetchStreets()
  117. let hasNext = true
  118. let after
  119. const limit = 10
  120. while (hasNext) {
  121. const r = await Street.paginate({ limit, after })
  122. for (let i = 0; i < r.results.length; i++) {
  123. const { dataValues: {
  124. code: streetCode,
  125. areaCode,
  126. cityCode,
  127. provinceCode } } = r.results[i]
  128. const o = await crawler.fetchVillages(streetCode)
  129. for (const code in o) {
  130. const name = o[code]
  131. await Village.findOrCreate({
  132. where: { code },
  133. defaults: { code, name, streetCode, areaCode, cityCode, provinceCode }
  134. })
  135. }
  136. }
  137. hasNext = r.cursors.hasNext
  138. after = r.cursors.after
  139. }
  140. }