经朋友介绍,认识及了python实战:四周实习爬虫系统,然后看了转试飞教程,觉得课程分外对的,→_→重点是对于学员党有接触贵啊,经过几天纠结要决定参加这些科目了。
奥门美高梅手机版, 现在就无多说废话了,间接写感受,首先以课程要求安装lxml,Beautiful
Soup ,Requests,对了,忘记说我的条件,WIN7
64号,python3.4版本,其实有心换MAC,奈何非我们这种普通人买的从底,所以即便WIN环境优先用正在,因为自提前装了PIP,安装那些还死容易之,直接pip3
install xxxx就尽了,反正我中没有赶上错误。
什么条件呢准备好了,然后开基础科目,什么认识网页结构等等的饶未多说了,反正我呢只有是摸底一下夫,说具体的呢不是最领悟。然后要是一定网页元素了,我们如若如修是,用google
chrome浏览器中之检查,就足以查询到社团。当然刚起仍旧相比简单的,我看是较好学的。
剩下的饶是import各类库,然后用代码了:
刚巧开用BeautifulSoup如故认真的打一下代码吧,soup =
BeautifulSoup(html,’lxml’)
眼看是soup html都是变量 lxml是分析网页用之五单仓库中之一个
课程被所提的节点什么的似乎没什么麻烦之,兄弟节点和父子节点应该如故可看得懂的,只要学过高中生物遗传有的应该还容易看理解。
剩下的哪怕是温馨实际操作了,课程自带的网页就是可怜好之练手工具了,初始练手之后便实战58以及城市了。
先爬一个界面下的详细音讯,源代码如下
url = 'http://bj.58.com/pingbandiannao/25853969546167x.shtml' wb_data = requests.get(url) soup = BeautifulSoup(wb_data.text,'lxml')
url那个不用说了,是你假使拜的地点,然后据此requests获取内容储存到变量wb_data中,然后用BeauifulSoup解析到soup变量中,然后大家来提取一下想使的情,
title = soup.title.text price = soup.select('#content span.price') data = soup.select('.time') area = soup.select('.c_25d')
这里虽是提取想使之始末,因为标题是直接显示在网页头的,所以下了取巧方法titile.text,价格、更新时间、还有区域是运用的查结构的方去抱之,最终将他们封装在字典中,
data = { '标题':title, '价格':price[0].text, '时间':data[0].text, '所属区域':list(area[0].stripped_strings) if soup.find_all('span','c_25d') else None, '类型':'个人'if who_selit==0 else'商家', '浏览次数':get_view_from(url) }
因为区域有小网页遭到凡无的,所以拔取了if作为规范判断,假使没就再次来到控制None,幼儿打就打印,至于类型有来个if判断是深判断抓取的数目是个体如故公司之列表所祭,这里没什么关系。这段代码写了将来便是print打印一下内容了。
抓取单网页的内容就是终止了,下边说一下回来到列表页面去抓捕时列表的享有情节。
urls=[] list_view = 'http://bj.58.com/pbdn/{}/pn2/'.format(str(who_selit)) wb_data = requests.get(list_view) soup = BeautifulSoup(wb_data.text,'lxml') for link in soup.select('td.t > a.t'): if str('jump') in str(link) or str('zhuanzhuan')in str(link): pass else: urls.append(link.get('href').split('?')[0]) return urls
优先说生代码的步调,定义下urls变量为一个列表,然后定义一下list_view的内容,那里就是是58额列表页面,最终之方法.format(str(who_selit)),是替换一下内容,这么些是相比较简单,who_selit变量就是如果替换进去的情节,然后便解析网页什么的,通过select查找网页结构得到想使的网址,写个巡回进入取每个商品的网址,因为58内部有个转转界面,所以写个if判断下得到的网址,倘假若遛的就pass了,不是的口舌在到urls这些变量中。
由于浏览次数是是JS控制的,并且与货之URL是有必然关联的,这里自己贴一下代码,这段代码我不得不看懂,假若让自己说只123还当真说不出来。
id = url.split('/')[-1].strip('x.shtml') api = 'http://jst1.58.com/counter?infoid={}'.format(id) js = requests.get(api) views = js.text.split('=')[-1]
交此像便大多了
封装一下依次部分,然后做个完全的次下,上面贴一下完好无损的代码
#-*-coding:utf-8-*- from bs4 import BeautifulSoup import requests import time def get_urls(who_selit=0): urls=[] list_view = 'http://bj.58.com/pbdn/{}/pn2/'.format(str(who_selit)) wb_data = requests.get(list_view) soup = BeautifulSoup(wb_data.text,'lxml') for link in soup.select('td.t > a.t'): #剔除转转界面 if str('jump') in str(link) or str('zhuanzhuan')in str(link): pass else: urls.append(link.get('href').split('?')[0]) return urls #返回所有的商品界面 def get_view_from(url): id = url.split('/')[-1].strip('x.shtml') api = 'http://jst1.58.com/counter?infoid={}'.format(id) js = requests.get(api) #获取一下浏览次数 views = js.text.split('=')[-1] return views def get_info(who_selit=0): urls = get_urls(who_selit) for url in urls: wb_date = requests.get(url) soup = BeautifulSoup(wb_date.text,'lxml') title = soup.title.text price = soup.select('#content span.price') data = soup.select('.time') area = soup.select('.c_25d') data = { '标题':title, '价格':price[0].text, '时间':data[0].text, '所属区域':list(area[0].stripped_strings) if soup.find_all('span','c_25d') else None, '类型':'个人'if who_selit==0 else'商家', '浏览次数':get_view_from(url) } time.sleep(0.5) #延迟一下 避免58的反爬虫 print(data) #解析每个商品界面并且整理到字典中并且输出 get_info()
如上代码通过2016.05.06测试好运用以是输出