Python爬取网上车市[http://www.cheshi.com/]的数据
#coding:utf8
#爬取网上车市[http://www.cheshi.com/]的数据
import requests, json, time, re, os, sys, time,urllib2,shutil,string
import threading
import MySQLdb
import redis
from pyquery import PyQuery as pq
from urlparse import urljoin
from selenium import webdriver #设置utf-8编码格式
reload(sys)
sys.setdefaultencoding( "utf-8" ) #读取文件内容
def getLines(filename):
file_object = open(filename,'rb')
lines = file_object.readlines()
return lines #根据url_name获取url_type_id
def get_url_type_id(v_url_name):
#3000 品牌 奥迪
#4000 奥迪 奥迪A6
url_type_id = ''
for line in getLines('/home/shutong/crawl/car/script/brand.ini'):
line = line.strip()
url_cate = line.split(',')[1]
url_name = line.split(',')[2]
if v_url_name.strip() == url_name.strip():
url_type_id = line.split(',')[0]
return url_type_id
break
else :
continue
return url_type_id class ResultData():
'''数据文件类'''
def __init__(self,industry_id,url_type_id,url_name,url_value,web_type_id,web_name,date_id):
self.industry_id = industry_id
self.url_type_id = url_type_id
self.url_name = url_name
self.url_value = url_value
self.web_type_id = web_type_id
self.web_name = web_name
self.date_id = date_id def __str__(self):
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 class Base(object):
'''文件保存的基类''' def __init__(self,dev_prd_flag):
self.dev_prd_flag = dev_prd_flag
pass
#print "This is init function" #保存数据到文件文件
def _saveContext(self,filename,*name):
format = '^'
context = name[0]
for i in name[1:]:
context = context + format + str(i)
context = str(context).replace('(','(').replace(')',')').replace(',',',').replace(':',':')
if self.dev_prd_flag != 'prd':
print context
else:
#去除文件路径名首位空格
filename = filename.strip()
#读取目录名称
path = os.path.dirname(filename)
#如果目录不存在则创建目录
if not os.path.exists(path):
os.makedirs(path)
#读取文件名称,以追加的方式写文件
name = os.path.basename(filename)
fp = open(filename,'a')
fp.write(context+'\n')
fp.close() def saveData(self,filename,ResultData):
if ResultData.url_type_id:
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)
else:
#将数据进行保存在redis中
r = redis.Redis(host='192.168.122.140',port=6379,db=0)
r.sadd('errorList',ResultData.industry_id+'^'+ResultData.url_name+'^'+ResultData.url_value) def __str__(self):
return '保存文件的基类' class Crawl(Base):
'''爬虫基础类'''
driver = None
#构造方法
def __init__(self,name,dev_prd_flag):
super(Crawl,self).__init__(dev_prd_flag='dev')
self.dev_prd_flag = dev_prd_flag
self.name = name
#self.driver = init_driver() '''初始化启动浏览器'''
def init_driver(self):
ua = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.3 Safari/537.36"
cap = webdriver.DesiredCapabilities.PHANTOMJS
cap["phantomjs.page.settings.resourceTimeout"] = 20000
cap["phantomjs.page.settings.loadImages"] = True
cap["phantomjs.page.settings.disk-cache"] = True
cap["phantomjs.page.settings.userAgent"] = ua
cap["phantomjs.page.customHeaders.User-Agent"] =ua
cap["phantomjs.page.customHeaders.Referer"] = "http://tj.ac.10086.cn/login/"
driver = webdriver.PhantomJS(executable_path='/home/shutong/phantomjs/bin/phantomjs',desired_capabilities=cap, service_args=['--ignore-ssl-errors=true'])
driver.set_page_load_timeout(60)
driver.set_script_timeout(60)
#return driver
self.driver = driver #获取网页文本
def getHtml(self,url,code='utf-8'):
html = ''
try:
if self.driver:
self.driver.get(url)
html = self.driver.page_source
else :
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
request = urllib2.Request(url,headers=headers)
response = urllib2.urlopen(request,data=None,timeout=60)
if code:
if code == 'gbk':
html = unicode(response.read(),'gbk')
else:
html = unicode(response.read(),str(code))
except:
pass
finally:
return html '''析构方法'''
def __del__(self):
if self.driver:
self.driver.quit()
print "浏览器成功关闭"
else:
print "浏览器未打开使用" def __str__(self):
return "爬虫基础类" def start_crawl(url):
#连接redis数据库
r = redis.Redis(host='192.168.122.140',port=6379,db=0)
urllist = []
html = crawl.getHtml(url,'gbk')
d = pq(html)
for a in d('a'):
a = pq(a)
try:
url_value = urljoin(url,a.attr('href'))
name = a.text()
#if re.compile(r'([a-z]+) ([a-z]+)', re.I)
#http://newcar.xcar.com.cn/162/
if re.match( r'http://newcar.xcar.com.cn/[0-9]{1,10}/$', url_value, re.M|re.I):
#print url_value,name
#urllist.append(url_value)
#将数据存储在redis中
#r.sadd('urllist',url_value)
pass
elif re.match(r'http://newcar.xcar.com.cn/m[0-9]{1,10}/$',url_value,re.M|re.I):
r.sadd('urllist',url_value)
except:
pass
#for index in urllist:
for index in list(set(urllist)):
print index
try:
#return start_crawl(index)
pass
except:
pass def start_wscs_crawl(url): #生产或者测试标志 dev为测试 prd为生产
flag = 'prd'
#汽车行业ID
industry_id = ''
#移动PC端web_type_id
web_type_id = ''
#网站名称
web_name = '网上车市'
crawl = Crawl('网上车市',flag)
#加载浏览器
#crawl.init_driver()
html = crawl.getHtml(url)
d = pq(html)
for div in d('div').filter('.list-box'):
div = pq(div)
#品牌
brand = div('div').filter('.lb').find('span').text()
#品牌url
brand_url = urljoin(url,div('div').filter('.lb')('a').attr('href'))
#print brand,brand_url
url_type_id = ''
url_name = brand
url_value = brand_url
#保存品牌数据
#crawl._saveContext(filename,industry_id,url_type_id,url_name,url_value,web_type_id,web_name)
resultData = ResultData(industry_id,url_type_id,url_name,url_value,web_type_id,web_name,date_id)
crawl.saveData(filename,resultData) brand = div('div').filter('.rb')('dl')('dt')('a').text().replace('>>','')
brand_url = urljoin(url,div('div').filter('.rb')('dl')('dt')('a').attr('href'))
#print brand,brand_url
url_type_id = ''
url_name = brand
url_value = brand_url
#保存品牌数据
resultData = ResultData(industry_id,url_type_id,url_name,url_value,web_type_id,web_name,date_id)
crawl.saveData(filename,resultData)
#crawl._saveContext(filename,industry_id,url_type_id,url_name,url_value,web_type_id,web_name) for dd in div('div').filter('.rb')('dl')('dd'):
dd = pq(dd)
car_name = dd('div').filter('.con')('h4').text()
car_url = urljoin(url,dd('div').filter('.con')('h4')('a').attr('href'))
#print car_name,car_url
url_type_id = get_url_type_id(car_name)
url_name = car_name
url_value = car_url
#保存车系数据
#crawl._saveContext(filename,industry_id,url_type_id,url_name,url_value,web_type_id,web_name) resultData = ResultData(industry_id,url_type_id,url_name,url_value,web_type_id,web_name,date_id)
crawl.saveData(filename,resultData)
#制作汽车实体信息
#品牌 子品牌 车系名称 价位 图片url 网站名称 #多线程启动
def start_mutli_crawl():
list = []
for word in string.uppercase:
#url = 'http://www.autohome.com.cn/grade/carhtml/%s.html' %(word)
url = 'http://product.cheshi.com/static/selectcar/%s.html?t=1519713137030' % (word)
list.append(url)
#定义线程数组
threads = []
#创建线程
for i in range(len(list)):
t = threading.Thread(target=start_wscs_crawl,args=(list[i],))
threads.append(t) #开启线程
for i in range(len(list)):
threads[i].start() for i in range(len(list)):
threads[i].join() #filename = '/home/shutong/crawl/car/script/wscs.csv'
#date_id = '20180227' date_id = sys.argv[1]
filename = sys.argv[2]
#url = 'http://product.cheshi.com/static/selectcar/B.html?t=1519713137030'
#start_wscs_crawl(url)
#多线程启动
start_mutli_crawl()
Python爬取网上车市[http://www.cheshi.com/]的数据的更多相关文章
- python爬取《龙岭迷窟》的数据,看看质量剧情还原度到底怎么样
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:简单 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行 ...
- Python 爬取 热词并进行分类数据分析-[云图制作+数据导入]
日期:2020.01.28 博客期:136 星期二 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入](本期博客) ...
- python爬取返利网中值得买中的数据
先使用以前的方法将返利网的数据爬取下来,scrapy框架还不熟练,明日再战scrapy 查找目标数据使用的是beautifulsoup模块. 1.观察网页,寻找规律 打开值得买这块内容 1>分析 ...
- 使用Python爬取、清洗并分析前程无忧的大数据职位
爬取前程无忧的数据(大数据职位) # -*- coding: utf-8 -*- """ Created on Wed Nov 1 14:47:27 2019 @auth ...
- Node.js/Python爬取网上漫画
某个周日晚上偶然发现了<火星异种>这部漫画,便在网上在线看了起来.在看的过程中图片加载很慢,而且有时候还不小心点到广告,大大延缓了我看的进度.后来想到能不能把先把漫画全部抓取到本地再去看. ...
- python爬取网站数据
开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...
- python爬取免费优质IP归属地查询接口
python爬取免费优质IP归属地查询接口 具体不表,我今天要做的工作就是: 需要将数据库中大量ip查询出起归属地 刚开始感觉好简单啊,毕竟只需要从百度找个免费接口然后来个python脚本跑一晚上就o ...
- 利用Python爬取豆瓣电影
目标:使用Python爬取豆瓣电影并保存MongoDB数据库中 我们先来看一下通过浏览器的方式来筛选某些特定的电影: 我们把URL来复制出来分析分析: https://movie.douban.com ...
- Python爬取LOL英雄皮肤
Python爬取LOL英雄皮肤 Python 爬虫 一 实现分析 在官网上找到英雄皮肤的真实链接,查看多个后发现前缀相同,后面对应为英雄的ID和皮肤的ID,皮肤的ID从00开始顺序递增,而英雄ID跟 ...
随机推荐
- 虚拟机安装centos发现inet为127.0.0.1,导致Xshell连接不上
问题如标题所示: 设置网卡开机自动启动: 实质linux是看一个网卡文件的配置,就是/etc/sysconfig/network-scripts/ifcfg-eth0 (这个文件名看你网卡名称而异,具 ...
- 以女朋友为例讲解 TCP/IP 三次握手与四次挥手
背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 问题 有时候聊天的过程中,我的网络或者她的网络可能会不好,视频就会卡住,听不到对方的声 ...
- Mysql蠕虫复制
将查询出来的数据插入到指定表中,形如: INSERT into user_info(version,create_user_count,create_pc_count) select version, ...
- ECS 游戏架构 实现
转载自:http://blog.csdn.net/i_dovelemon/article/details/27230719 实现 组件-实体-系统 - 博客频道 这篇文章是在我前面文章,理解组件- ...
- Spring.net 在aps.net Web的配置复习
1.引入程序集Spring.Core,CommonLogging,Spring.Web 2.Web.Config的配置 <?xml version="1.0" encodin ...
- linux常用Java程序员使用命令(一)
pwd 显示当前路径cd 切换目录 . .. ~ls 显示文件(夹) -l 显示详细信息 -a 显示全部,包括隐藏文件(夹) mkdir 创建文件夹 -p 递归创建 touch 创建空白文件 echo ...
- 编写高质量代码改善C#程序的157个建议——建议130:以复数命名枚举类型,以单数命名枚举元素
建议130:以复数命名枚举类型,以单数命名枚举元素 枚举类型应该具有负数形式,它表达的是将一组相关元素组合起来的语义.比如: enum Week { Monday, Tuesday, Wednesda ...
- 团体程序设计天梯赛L1-022 奇偶分家 2017-03-22 17:48 81人阅读 评论(0) 收藏
L1-022. 奇偶分家 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定N个正整数,请统计奇数和偶数各有多少个? 输入格式 ...
- arch+win7 双系统启动引导
笔者的电脑之前已经安装了win7,安装完arch后电脑中存在两个系统,因此需要引导连个系统. 1. 在安装arch时,一般都会安装grub.如果没有安装,则参考arch wiki中 grub2一节安装 ...
- [转载]Java集合系列大全总结
Java 集合系列目录(Category) 22:06:49 2019-02-27