实战作业58抓取

from bs4 import BeautifulSoup
import requests
from selenium import webdriver
import time
# import asyncio
# from selenium.webdriver.common.desired_capabilities import DesiredCapabilities #(1)
# from selenium.common.exceptions import NoSuchElementException
# from selenium.webdriver.common.keys import Keys



#*********************************************
root_data = [] #存储数据
#*********************************************
#page 搜索多少页信息
#@asyncio.coroutine
def get_data(page=1):
pages_url = [] #根据page产生的带页码的url
page_urls = [] #每一页上的产品列表url(不包括推荐,和转转的)
#for 根据page循环产生页码
for i in range(page):
if(i == 0):
pages_url.append('http://bj.58.com/pbdn/0/')
else:
#http://bj.58.com/pbdn/0/pn8/
pages_url.append('http://bj.58.com/pbdn/0/pn'+str(i+1)+'/')
# for 根据pages_url产生每一页上的产品列表url(不包括推荐,和转转的)
t1 = time.time()
for page_url in pages_url:
wb_data = requests.get(page_url)
wb_data.encoding = 'utf-8'
soup = BeautifulSoup(wb_data.text, 'lxml')
fileData_ = soup.select("#mainlist > #infolist tr")
for data in fileData_:
if('zzinfo' not in str(data.get('class')) and 'bg' not in str(data.get('class'))):
if('class="ico accurate"') not in str(data):
url = data.select("td > a")[0].get('href')
page_urls.append(url)
print('过滤推广和转转-采集详细页被添加了url为:',url)
t2 = time.time()
print('所有过滤的采集详细页添加完毕(共',len(page_urls),')条,用时:', t2 - t1)
#根据page_urls得到所有详细页码的需要采集的数据,
num = 0
for page_content in page_urls:
list_data = {'类目': '', '标题': '', '发布时间': '', '访问量': '', '价格': '', '成色': '', '区域': '', 'url': ''} # 详情页码的采集数据
wb_data = requests.get(page_content)
wb_data.encoding = 'utf-8'
soup = BeautifulSoup(wb_data.text, 'lxml')
# soup, list_data = yield from asyncio_page_contents(page_content,list_data)
list_data['url'] = page_content # url
get_leimu(list_data,soup) #类目
get_biaoti(list_data, soup) #标题
get_jg_cs_qy(list_data, soup) #价格、成色、区域
get_views(list_data,page_content) #访问量,此处转浏览量速度较慢,可以注释掉运行
root_data.append(list_data) #存储数据
num = num + 1
print('抓取成功',num,'次数据')

#@asyncio.coroutine
# def asyncio_page_contents(url,list_data):
# list_data = {'类目': '', '标题': '', '发布时间': '', '访问量': '', '价格': '', '成色': '', '区域': '', 'url': ''} # 详情页码的采集数据
# wb_data = requests.get(url)
# wb_data.encoding = 'utf-8'
# soup = BeautifulSoup(wb_data.text, 'lxml')
# list_data['url'] = url # url
# return soup,list_data


#得到商品最低级别类目 和 时间
# @asyncio.coroutine
def get_leimu(list_data,soup):
fileData = soup.select('#logo')[0].next_siblings#根据id找到他的所有后兄弟标签(防止空格,换行,制表符,非法字符等)
for data in fileData:
if('div' in str(data)):#找兄弟div标签标签(防止空格,换行,制表符,非法字符等)通过查看发现其实只有一个
temp_data = data.select('a') #所有的类目a标签
temp_list = []
for d in temp_data:
temp_list.append(d.text)
len_ = len(temp_list)
leimu = temp_list[len_-1]#得到类目
list_data['类目'] = str(leimu) #设置类目
for li in soup.select('#totalcount')[0].parent.previous_siblings:
if('li' in str(li)):
fatie_time = li.text #得到发布时间
list_data['发布时间'] = str(fatie_time) # 设置发布时间
#得到商品标题
# @asyncio.coroutine
def get_biaoti(list_data,soup):
fileData = soup.select('#index_show')[0].previous_siblings#根据id找到他的所有前兄弟标签(防止空格,换行,制表符,非法字符等)
for data in fileData:
if('h1' in str(data)):#找兄弟h1标签标签(防止空格,换行,制表符,非法字符等)通过查看发现其实只有一个
temp_data = data.text #得到标题
list_data['标题'] = str(temp_data) # 设置标题
#价格成色,区域,col_sub sumary
# @asyncio.coroutine
def get_jg_cs_qy(list_data,soup):
fileData = soup.select('.col_sub.sumary')[0].find_all('li')
li_lsit = list(fileData) #只要前三个价格,成色,区域
jiage = li_lsit[0].select('.price.c_f50')[0].text + '元'#得到价格
list_data['价格'] = str(jiage) # 设置价格
chengse = li_lsit[1].select('span')[0].text.replace('\t', '').\
replace('\n', '').replace('\r', '').replace(' ', '') #得到成色
list_data['成色'] = str(chengse) # 设置成色
quyu = ''#得到区域
for diqu in li_lsit[2].select('a'):
quyu = quyu + diqu.text.replace('\t', '').replace('\n', '').replace('\r', '').replace(' ', '')
list_data['区域'] = str(quyu) # 设置成色
#得到访问量
# @asyncio.coroutine
def get_views(list_data,url):
# yield from driver.get(url)
driver.get(url)
pageSource = driver.page_source
bsObj = BeautifulSoup(pageSource,'xml')
temp = bsObj.find(id = 'totalcount')
driver.implicitly_wait(0.1)#等待0.1秒,让页面加载完毕(比如有大量ajax请求等待返回结果)
views = temp.text #得到访问量
list_data['访问量'] = str(views) # 设置访问量

#测试
t1 = time.time()
page_all = 1 #设置抓取几页数据

# webdriver.Remote(desired_capabilities=DesiredCapabilities.HTMLUNIT)
driver = webdriver.PhantomJS(executable_path='D://phantomjs-2.1.1//bin//phantomjs') #浏览器在后台执行。。隐藏的js库

get_data(page_all) #开始采集
for data in root_data:
print(data)
driver.close()
t2 = time.time()
print('一共抓取了',str(page_all),'页的数据; ','共计',str(len(root_data)),'条数据',' 耗时:',str(t2-t1),' 秒')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容