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),' 秒')
实战作业58抓取
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 作业要求: 作业要求更改说明:由于58同城页面改版,二手商品的个人卖家均改为了“转转”,因此,本次爬虫作业,无法屏...
- 本周最后一节课了,这大作业比较综合,要在页面上提取网址,然后根据提取到的网址,进行解析,提取每个网址上面的有效信息...
- 我的成果 我的代码 我的感想: 这个作业做完了,但感觉有点勉强,而且满是疑惑,没有清爽的感觉,可能是“困难”带来的...