1. import math
  2. import re
  3.  
  4. import requests
  5.  
  6. from lxml import etree
  7.  
  8. type = "https://www.cnrepark.com/gyy/park{}/"
  9. urlList = []
  10. for i in range(1,8):
  11. url = type.format(i)
  12. urlList.append(url)
  13.  
  14. from time import sleep
  15. from selenium import webdriver
  16. from selenium.webdriver.chrome.options import Options
  17. options = Options()
  18. options.add_argument('--headless')
  19. br = webdriver.Chrome(chrome_options=options)
  20.  
  21. class ChanyeList(object):
  22.  
  23. User_Agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
  24. Refer = "https://www.cnrepark.com"
  25.  
  26. # 初始化
  27. def __init__(self,br):
  28. self.br = br
  29.  
  30. # 使用selenium下载内容
  31. def selenium_download(self,url):
  32. br.get(url)
  33. content = self.br.page_source
  34. return content
  35.  
  36. def get_total_numbers(self,url):
  37. content = self.selenium_download(url)
  38. html = etree.HTML(content)
  39. totalNumbersTxt = html.xpath('.//div[@class="nw_num"]/text()')
  40. import re
  41. totalNumbers = re.findall(r'\d+',totalNumbersTxt[0])
  42. return totalNumbers[0]
  43. # 解析出列表
  44. def html_parse_list(self,content):
  45. html = etree.HTML(content)
  46. listObj = html.xpath('.//div[@class="area"]//div[@class="con_lst"]')
  47. list = []
  48. for item in listObj:
  49. src = item.xpath('./div/a/img/@src')
  50. href = item.xpath('./div//h2/a/@href')
  51. title = item.xpath('./div//h2/a/text()')
  52. list.append({'title':title[0],'href':href[0],"src":src[0]})
  53. return list
  54.  
  55. def optimizeContent(self,res):
  56. res = res.replace('b\'', '')
  57. res = res.replace('\\n', '')
  58. res = res.replace('\'', '')
  59. return res
  60.  
  61. # 解析出详情
  62. def html_parse_detail(self,content):
  63. html = etree.HTML(content)
  64. detail = html.xpath('.//div[@class="right_nr"]/div[1]//div[@class="kfq_box"]/ul')
  65. detail = etree.tostring(detail[0])
  66. detail = self.optimizeContent(str(detail))
  67.  
  68. # 区域优势
  69. regionalAdvantages = html.xpath('.//div[@id="tbc_81"]')
  70. regionalAdvantages = etree.tostring(regionalAdvantages[0])
  71. regionalAdvantages = self.optimizeContent(str(regionalAdvantages))
  72.  
  73. # 基础配套
  74. basicConfiguration = html.xpath('.//div[@id="tbc_82"]')
  75. basicConfiguration = etree.tostring(basicConfiguration[0])
  76. basicConfiguration = self.optimizeContent(str(basicConfiguration))
  77.  
  78. # 优惠政策
  79. preferentialPolicy = html.xpath('.//div[@id="tbc_83"]')
  80. preferentialPolicy = etree.tostring(preferentialPolicy[0])
  81. preferentialPolicy = self.optimizeContent(str(preferentialPolicy))
  82.  
  83. # 规划建设
  84. planningInformation = html.xpath('.//div[@id="tbc_84"]')
  85. planningInformation = etree.tostring(planningInformation[0])
  86. planningInformation = self.optimizeContent(str(planningInformation))
  87.  
  88. res = {'detail': detail,
  89. "regionalAdvantages": regionalAdvantages,
  90. "basicConfiguration": basicConfiguration,
  91. "preferentialPolicy": preferentialPolicy,
  92. "planningInformation": planningInformation,
  93. }
  94.  
  95. return res;
  96.  
  97. def crawl_url(self,url):
  98. print("crawl page {}".format(url))
  99. listContent = self.selenium_download(url)
  100. list = self.html_parse_list(listContent)
  101. return list
  102.  
  103. def get_name(self,index):
  104. nameList = [
  105. "特色园区",
  106. "创意园",
  107. "孵化基地",
  108. "商务园区",
  109. "生态园区",
  110. "综合乐园",
  111. "产业园转移区"
  112. ]
  113. return nameList[index]
  114.  
  115. # 保存list 获取到详情 保存为html
  116. def save_list(self,list,type_index):
  117. try:
  118. for item in list:
  119. url = item['href']
  120. print("crawl url :"+url)
  121. content = self.selenium_download(url)
  122. detailList = self.html_parse_detail(content)
  123. item['title'] = self.validateTitle(item['title'])
  124. type_name = self.get_name(type_index)
  125. with open("./txt/"+type_name+"-"+item['title']+".html","w") as f:
  126. f.write("<h2>{}</h2>".format(item['title']))
  127. f.write("<div> <a href='{}'><img style='height:80px;height:80px;' src={} /></a></div>".format(item['href'],item['src']))
  128. f.write("<p>{}</p>".format(detailList['detail']))
  129. f.write("<p>{}</p><h3>区位优势:</h3>{}".format(detailList['detail'],detailList['regionalAdvantages']))
  130. f.write("<p>{}</p><h3>基础配套:</h3>{}".format(detailList['detail'],detailList['basicConfiguration']))
  131. f.write("<p>{}</p><h3>优惠政策:</h3>{}".format(detailList['detail'],detailList['preferentialPolicy']))
  132. f.write("<p>{}</p><h3>规划建设:</h3>{}".format(detailList['detail'],detailList['planningInformation']))
  133. f.write("<br>")
  134. f.close()
  135. except Exception as e:
  136. print("Exception:"+str(e))
  137. def validateTitle(self,title):
  138. rstr = r"[\/\\\:\*\?\"\<\>\|\(\)]" # '/ \ : * ? " < > |'
  139. new_title = re.sub(rstr, "_", title) # 替换为下划线
  140. return new_title
  141. if __name__ == "__main__":
  142. try:
  143.  
  144. rootUrl = "https://www.cnrepark.com/gyy/park{}/"
  145.  
  146. for k in range(1,8):
  147. chanyeList = ChanyeList(br)
  148. baseUrl = "https://www.cnrepark.com/gyy/park"+str(k)+"/?publishtime=desc&page={}"
  149. pageUrl = "https://www.cnrepark.com/gyy/park"+str(k)+"/"
  150. # 获取总页数
  151. totalNumbers = chanyeList.get_total_numbers(pageUrl)
  152. totalPage = math.ceil( int(totalNumbers) / 13)
  153. result = []
  154. for page in range(1,int(totalPage) + 1 ):
  155. realUrl = baseUrl.format(page)
  156. list = chanyeList.crawl_url(realUrl)
  157. result.extend(list)
  158. chanyeList.save_list(result,k-1)
  159.  
  160. br.quit()
  161. except Exception as e:
  162. print(str(e))

python+selenium 爬取中国工业园网的更多相关文章

  1. Python爬取中国天气网

    Python爬取中国天气网 基于requests库制作的爬虫. 使用方法:打开终端输入 “python3 weather.py 北京(或你所在的城市)" 程序正常运行需要在同文件夹下加入一个 ...

  2. 初识python 之 爬虫:爬取中国天气网数据

    用到模块: 获取网页并解析:import requests,html5lib from bs4 import BeautifulSoup 使用pyecharts的Bar可视化工具"绘制图表& ...

  3. Python+Selenium爬取动态加载页面(1)

    注: 最近有一小任务,需要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统和全国水雨情网.由于这两个网站的数据都是动态加载出来的,所以我用了Selenium来完成我的数据获取. ...

  4. selenium爬取煎蛋网

    selenium爬取煎蛋网 直接上代码 from selenium import webdriver from selenium.webdriver.support.ui import WebDriv ...

  5. Python+Selenium爬取动态加载页面(2)

    注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ...

  6. Python Scrapy 爬取煎蛋网妹子图实例(一)

    前面介绍了爬虫框架的一个实例,那个比较简单,这里在介绍一个实例 爬取 煎蛋网 妹子图,遗憾的是 上周煎蛋网还有妹子图了,但是这周妹子图变成了 随手拍, 不过没关系,我们爬图的目的是为了加强实战应用,管 ...

  7. Python爬取中国票房网所有电影片名和演员名字,爬取齐鲁网大陆所有电视剧名称

    爬取CBO中国票房网所有电影片名和演员名字 # -*- coding: utf-8 -*- # 爬取CBO中国票房网所有电影片名 import json import requests import ...

  8. python爬取中国知网部分论文信息

    爬取指定主题的论文,并以相关度排序. #!/usr/bin/python3 # -*- coding: utf-8 -*- import requests import linecache impor ...

  9. scrapy实例:爬取中国天气网

    1.创建项目 在你存放项目的目录下,按shift+鼠标右键打开命令行,输入命令创建项目: PS F:\ScrapyProject> scrapy startproject weather # w ...

随机推荐

  1. 最优得分 score

    Solution: 一道很典型的dp题目, 对于 20% 的数据(Bi=0),直接使用01背包即可. 对于 100% 的数据,我们需要进行分析,当我们对 …a,b… 和 …b,a… (…表示的是相同的 ...

  2. Gradle系列之Android Gradle插件

    原文发于微信公众号 jzman-blog,欢迎关注交流. 通过前面几篇文章学习了 Gradle 基础知识以及 Gradle 插件相关的知识,关于 Gradle 及其插件相关知识请先阅读下面几篇文章: ...

  3. Hadoop之MapReduce开发总结

    @ 目录 1.输入数据接口:InputFormat 2.逻辑处理接口:Mapper 3.Partitioner分区 4.Comparable排序 5.Combiner合并(可选) 6.Reduce端分 ...

  4. 学习 | 基于require.js的三级联动菜单【入门】

    主要目的是学习如何使用require.js AMD就是通过延迟和按需加载来解决各个模块的依赖关系,其中require就是AMD的框架之一 它的优点是可以解决以下问题: JS文件的依赖关系. 通过异步加 ...

  5. 面试官:哪些场景会产生OOM?怎么解决?

    这个面试题是一个朋友在面试的时候碰到的,什么时候会抛出OutOfMemery异常呢?初看好像挺简单的,其实深究起来考察的是对整个JVM的了解,而且这个问题从网上可以翻到一些乱七八糟的答案,其实在总结下 ...

  6. JVM学习(五)对象的引用类型

    一.引言 前面我们学习了JVM的垃圾回收机制,我们知道了垃圾回收是JVM的自发行为:虽然我们可以通过System.gc() 或Runtime.getRuntime().gc()进行显式调用垃圾回收 , ...

  7. 微服务实战系列(六)-网关springcloud zuul

    1. 场景描述 今天接着介绍springcloud,今天介绍下springcloud的路由网关-Zuul,外围系统或者用户通过网关访问服务,网关通过注册中心找到对应提供服务的客户端,网关也需要到注册中 ...

  8. C++雾中风景15:聊聊让人抓狂的Name Mangling

    Name Mangling,直接翻译过来为名字改写 .它是深入理解 C++ 编译链接模型的必由之路. 笔者近期进行数据库开发工作时,涉及到MySQL客户端的编译链接的问题,通过重新厘清了之前理解一知半 ...

  9. Linux 文件系统之入门必看!

    在 Linux 中,最直观.最可见的部分就是 文件系统(file system).下面我们就来一起探讨一下关于 Linux 中国的文件系统,系统调用以及文件系统实现背后的原理和思想.这些思想中有一些来 ...

  10. 接口鉴权,提供给第三方调用的接口,进行sign签名

    //场景:公司要跟第三方公司合作,提供接口给对方对接,这样需要对接口进行授权,不然任何人都可以调我们公司的接口,会导致安全隐患: 思路: 在每个接口请求参数都带上ApiKey 和sign签名: 我们在 ...