1. #coding:utf8
  2. #爬取网上车市[http://www.cheshi.com/]的数据
  3. import requests, json, time, re, os, sys, time,urllib2,shutil,string
  4. import threading
  5. import MySQLdb
  6. import redis
  7. from pyquery import PyQuery as pq
  8. from urlparse import urljoin
  9. from selenium import webdriver
  10.  
  11. #设置utf-8编码格式
  12. reload(sys)
  13. sys.setdefaultencoding( "utf-8" )
  14.  
  15. #读取文件内容
  16. def getLines(filename):
  17. file_object = open(filename,'rb')
  18. lines = file_object.readlines()
  19. return lines
  20.  
  21. #根据url_name获取url_type_id
  22. def get_url_type_id(v_url_name):
  23. #3000 品牌 奥迪
  24. #4000 奥迪 奥迪A6
  25. url_type_id = ''
  26. for line in getLines('/home/shutong/crawl/car/script/brand.ini'):
  27. line = line.strip()
  28. url_cate = line.split(',')[1]
  29. url_name = line.split(',')[2]
  30. if v_url_name.strip() == url_name.strip():
  31. url_type_id = line.split(',')[0]
  32. return url_type_id
  33. break
  34. else :
  35. continue
  36. return url_type_id
  37.  
  38. class ResultData():
  39. '''数据文件类'''
  40. def __init__(self,industry_id,url_type_id,url_name,url_value,web_type_id,web_name,date_id):
  41. self.industry_id = industry_id
  42. self.url_type_id = url_type_id
  43. self.url_name = url_name
  44. self.url_value = url_value
  45. self.web_type_id = web_type_id
  46. self.web_name = web_name
  47. self.date_id = date_id
  48.  
  49. def __str__(self):
  50. return self.industry_id,self.url_type_id,self.url_name,self.url_value,self.web_type_id,self.self.web_name,ResultData.date_id
  51.  
  52. class Base(object):
  53. '''文件保存的基类'''
  54.  
  55. def __init__(self,dev_prd_flag):
  56. self.dev_prd_flag = dev_prd_flag
  57. pass
  58. #print "This is init function"
  59.  
  60. #保存数据到文件文件
  61. def _saveContext(self,filename,*name):
  62. format = '^'
  63. context = name[0]
  64. for i in name[1:]:
  65. context = context + format + str(i)
  66. context = str(context).replace('(','(').replace(')',')').replace(',',',').replace(':',':')
  67. if self.dev_prd_flag != 'prd':
  68. print context
  69. else:
  70. #去除文件路径名首位空格
  71. filename = filename.strip()
  72. #读取目录名称
  73. path = os.path.dirname(filename)
  74. #如果目录不存在则创建目录
  75. if not os.path.exists(path):
  76. os.makedirs(path)
  77. #读取文件名称,以追加的方式写文件
  78. name = os.path.basename(filename)
  79. fp = open(filename,'a')
  80. fp.write(context+'\n')
  81. fp.close()
  82.  
  83. def saveData(self,filename,ResultData):
  84. if ResultData.url_type_id:
  85. self._saveContext(filename,ResultData.industry_id,ResultData.url_type_id,ResultData.url_name,ResultData.url_value,ResultData.web_type_id,ResultData.web_name,ResultData.date_id)
  86. else:
  87. #将数据进行保存在redis中
  88. r = redis.Redis(host='192.168.122.140',port=6379,db=0)
  89. r.sadd('errorList',ResultData.industry_id+'^'+ResultData.url_name+'^'+ResultData.url_value)
  90.  
  91. def __str__(self):
  92. return '保存文件的基类'
  93.  
  94. class Crawl(Base):
  95. '''爬虫基础类'''
  96. driver = None
  97. #构造方法
  98. def __init__(self,name,dev_prd_flag):
  99. super(Crawl,self).__init__(dev_prd_flag='dev')
  100. self.dev_prd_flag = dev_prd_flag
  101. self.name = name
  102. #self.driver = init_driver()
  103.  
  104. '''初始化启动浏览器'''
  105. def init_driver(self):
  106. ua = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.3 Safari/537.36"
  107. cap = webdriver.DesiredCapabilities.PHANTOMJS
  108. cap["phantomjs.page.settings.resourceTimeout"] = 20000
  109. cap["phantomjs.page.settings.loadImages"] = True
  110. cap["phantomjs.page.settings.disk-cache"] = True
  111. cap["phantomjs.page.settings.userAgent"] = ua
  112. cap["phantomjs.page.customHeaders.User-Agent"] =ua
  113. cap["phantomjs.page.customHeaders.Referer"] = "http://tj.ac.10086.cn/login/"
  114. driver = webdriver.PhantomJS(executable_path='/home/shutong/phantomjs/bin/phantomjs',desired_capabilities=cap, service_args=['--ignore-ssl-errors=true'])
  115. driver.set_page_load_timeout(60)
  116. driver.set_script_timeout(60)
  117. #return driver
  118. self.driver = driver
  119.  
  120. #获取网页文本
  121. def getHtml(self,url,code='utf-8'):
  122. html = ''
  123. try:
  124. if self.driver:
  125. self.driver.get(url)
  126. html = self.driver.page_source
  127. else :
  128. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
  129. request = urllib2.Request(url,headers=headers)
  130. response = urllib2.urlopen(request,data=None,timeout=60)
  131. if code:
  132. if code == 'gbk':
  133. html = unicode(response.read(),'gbk')
  134. else:
  135. html = unicode(response.read(),str(code))
  136. except:
  137. pass
  138. finally:
  139. return html
  140.  
  141. '''析构方法'''
  142. def __del__(self):
  143. if self.driver:
  144. self.driver.quit()
  145. print "浏览器成功关闭"
  146. else:
  147. print "浏览器未打开使用"
  148.  
  149. def __str__(self):
  150. return "爬虫基础类"
  151.  
  152. def start_crawl(url):
  153. #连接redis数据库
  154. r = redis.Redis(host='192.168.122.140',port=6379,db=0)
  155. urllist = []
  156. html = crawl.getHtml(url,'gbk')
  157. d = pq(html)
  158. for a in d('a'):
  159. a = pq(a)
  160. try:
  161. url_value = urljoin(url,a.attr('href'))
  162. name = a.text()
  163. #if re.compile(r'([a-z]+) ([a-z]+)', re.I)
  164. #http://newcar.xcar.com.cn/162/
  165. if re.match( r'http://newcar.xcar.com.cn/[0-9]{1,10}/$', url_value, re.M|re.I):
  166. #print url_value,name
  167. #urllist.append(url_value)
  168. #将数据存储在redis中
  169. #r.sadd('urllist',url_value)
  170. pass
  171. elif re.match(r'http://newcar.xcar.com.cn/m[0-9]{1,10}/$',url_value,re.M|re.I):
  172. r.sadd('urllist',url_value)
  173. except:
  174. pass
  175. #for index in urllist:
  176. for index in list(set(urllist)):
  177. print index
  178. try:
  179. #return start_crawl(index)
  180. pass
  181. except:
  182. pass
  183.  
  184. def start_wscs_crawl(url):
  185.  
  186. #生产或者测试标志 dev为测试 prd为生产
  187. flag = 'prd'
  188. #汽车行业ID
  189. industry_id = ''
  190. #移动PC端web_type_id
  191. web_type_id = ''
  192. #网站名称
  193. web_name = '网上车市'
  194. crawl = Crawl('网上车市',flag)
  195. #加载浏览器
  196. #crawl.init_driver()
  197. html = crawl.getHtml(url)
  198. d = pq(html)
  199. for div in d('div').filter('.list-box'):
  200. div = pq(div)
  201. #品牌
  202. brand = div('div').filter('.lb').find('span').text()
  203. #品牌url
  204. brand_url = urljoin(url,div('div').filter('.lb')('a').attr('href'))
  205. #print brand,brand_url
  206. url_type_id = ''
  207. url_name = brand
  208. url_value = brand_url
  209. #保存品牌数据
  210. #crawl._saveContext(filename,industry_id,url_type_id,url_name,url_value,web_type_id,web_name)
  211. resultData = ResultData(industry_id,url_type_id,url_name,url_value,web_type_id,web_name,date_id)
  212. crawl.saveData(filename,resultData)
  213.  
  214. brand = div('div').filter('.rb')('dl')('dt')('a').text().replace('>>','')
  215. brand_url = urljoin(url,div('div').filter('.rb')('dl')('dt')('a').attr('href'))
  216. #print brand,brand_url
  217. url_type_id = ''
  218. url_name = brand
  219. url_value = brand_url
  220. #保存品牌数据
  221. resultData = ResultData(industry_id,url_type_id,url_name,url_value,web_type_id,web_name,date_id)
  222. crawl.saveData(filename,resultData)
  223. #crawl._saveContext(filename,industry_id,url_type_id,url_name,url_value,web_type_id,web_name)
  224.  
  225. for dd in div('div').filter('.rb')('dl')('dd'):
  226. dd = pq(dd)
  227. car_name = dd('div').filter('.con')('h4').text()
  228. car_url = urljoin(url,dd('div').filter('.con')('h4')('a').attr('href'))
  229. #print car_name,car_url
  230. url_type_id = get_url_type_id(car_name)
  231. url_name = car_name
  232. url_value = car_url
  233. #保存车系数据
  234. #crawl._saveContext(filename,industry_id,url_type_id,url_name,url_value,web_type_id,web_name)
  235.  
  236. resultData = ResultData(industry_id,url_type_id,url_name,url_value,web_type_id,web_name,date_id)
  237. crawl.saveData(filename,resultData)
  238. #制作汽车实体信息
  239. #品牌 子品牌 车系名称 价位 图片url 网站名称
  240.  
  241. #多线程启动
  242. def start_mutli_crawl():
  243. list = []
  244. for word in string.uppercase:
  245. #url = 'http://www.autohome.com.cn/grade/carhtml/%s.html' %(word)
  246. url = 'http://product.cheshi.com/static/selectcar/%s.html?t=1519713137030' % (word)
  247. list.append(url)
  248. #定义线程数组
  249. threads = []
  250. #创建线程
  251. for i in range(len(list)):
  252. t = threading.Thread(target=start_wscs_crawl,args=(list[i],))
  253. threads.append(t)
  254.  
  255. #开启线程
  256. for i in range(len(list)):
  257. threads[i].start()
  258.  
  259. for i in range(len(list)):
  260. threads[i].join()
  261.  
  262. #filename = '/home/shutong/crawl/car/script/wscs.csv'
  263. #date_id = '20180227'
  264.  
  265. date_id = sys.argv[1]
  266. filename = sys.argv[2]
  267. #url = 'http://product.cheshi.com/static/selectcar/B.html?t=1519713137030'
  268. #start_wscs_crawl(url)
  269. #多线程启动
  270. start_mutli_crawl()

Python爬取网上车市[http://www.cheshi.com/]的数据的更多相关文章

  1. python爬取《龙岭迷窟》的数据,看看质量剧情还原度到底怎么样

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:简单 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行 ...

  2. Python 爬取 热词并进行分类数据分析-[云图制作+数据导入]

    日期:2020.01.28 博客期:136 星期二 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入](本期博客) ...

  3. python爬取返利网中值得买中的数据

    先使用以前的方法将返利网的数据爬取下来,scrapy框架还不熟练,明日再战scrapy 查找目标数据使用的是beautifulsoup模块. 1.观察网页,寻找规律 打开值得买这块内容 1>分析 ...

  4. 使用Python爬取、清洗并分析前程无忧的大数据职位

    爬取前程无忧的数据(大数据职位) # -*- coding: utf-8 -*- """ Created on Wed Nov 1 14:47:27 2019 @auth ...

  5. Node.js/Python爬取网上漫画

    某个周日晚上偶然发现了<火星异种>这部漫画,便在网上在线看了起来.在看的过程中图片加载很慢,而且有时候还不小心点到广告,大大延缓了我看的进度.后来想到能不能把先把漫画全部抓取到本地再去看. ...

  6. python爬取网站数据

    开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...

  7. python爬取免费优质IP归属地查询接口

    python爬取免费优质IP归属地查询接口 具体不表,我今天要做的工作就是: 需要将数据库中大量ip查询出起归属地 刚开始感觉好简单啊,毕竟只需要从百度找个免费接口然后来个python脚本跑一晚上就o ...

  8. 利用Python爬取豆瓣电影

    目标:使用Python爬取豆瓣电影并保存MongoDB数据库中 我们先来看一下通过浏览器的方式来筛选某些特定的电影: 我们把URL来复制出来分析分析: https://movie.douban.com ...

  9. Python爬取LOL英雄皮肤

    Python爬取LOL英雄皮肤 Python 爬虫  一 实现分析 在官网上找到英雄皮肤的真实链接,查看多个后发现前缀相同,后面对应为英雄的ID和皮肤的ID,皮肤的ID从00开始顺序递增,而英雄ID跟 ...

随机推荐

  1. nginx源码完全注释(1)ngx_alloc.h / ngx_alloc.c

    首先看 ngx_alloc.h 文件,主要声明或宏定义了 ngx_alloc,ngx_calloc,ngx_memalign,ngx_free. /* * Copyright (C) Igor Sys ...

  2. SQL Server的聚集索引和非聚集索引

    微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引)…… (一) ...

  3. 20-list简单使用:

    C++list的使用总结及常用list操作 C++中list用法详解 STL中list的erase()方法的使用   listiterator 最近刚刚接触stl的list    学习的时候遇到了很多 ...

  4. 面向对象的JavaScript-003

    1. // Since JavaScript doesn't exactly have sub-class objects, prototype is a useful workaround to m ...

  5. jQuery中deferred对象的使用(一)

    在jquery1.5之后的版本中,加入了一个deferred对象,也就是延迟对象,用来处理未来某一时间点发生的回调函数.同时,还改写了ajax方法,现在的ajax方法返回的是一个deferred对象. ...

  6. [C++] NEW Advanced Usage

    NEW Advanced Usage 将分配的内存限定在特定的一块区域 #include<iostream> #include<new> ); ); }; using name ...

  7. JMS 之 Active MQ 的消息传输

    本文使用Active MQ5.6 一.消息协商器(Message Broker) broke:消息的交换器,就是对消息进行管理的容器.ActiveMQ 可以创建多个 Broker,客户端与Active ...

  8. vi/vim 消除搜索后的关键字高亮

    使用vi或vim命令搜索某个关键字之后,取消高亮显示的方法 只要输入:noh即可

  9. STL中 map 和 multimap

    1. 所在头文件<map>. 命名空间std, 声明如下: namespace std{ template <class Key,class T, class Compare = l ...

  10. 06 Counting Point Mutations

    Problem Figure 2. The Hamming distance between these two strings is 7. Mismatched symbols are colore ...