本周最后一节课了,这大作业比较综合,要在页面上提取网址,然后根据提取到的网址,进行解析,提取每个网址上面的有效信息,例如标题、时间、地址、价格、浏览量等。
难点主要有:
- 要提取个人用户发布的信息,而非商家的。
- 浏览量由js控制,要找到js的网址才行。
- 有些页面没有地址信息,这会导致程序运行中断。
我的成果
我的代码
from bs4 import BeautifulSoup
import requests,time
def get_links_from(who_sells=0):
urls = []
list_view = 'http://bj.58.com/pbdn/{}/pn2/'.format(str(who_sells))
wb_data = requests.get(list_view)
soup=BeautifulSoup(wb_data.text,'lxml')
for link in soup.select('td.t a.t'):
urls.append(link.get('href').split('?')[0])
return urls
#print(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_item_info(who_sells=0):
urls = get_links_from(who_sells)
for url in urls:
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text,'lxml')
data = {
"title":soup.title.text,
"price": soup.select('div.price_li > span > i')[0].text,
'area': list(soup.select('div.palce_li > span > i')[0].stripped_strings),
"cata": '个人' if who_sells == 0 else '商家',
'views': soup.select('span.look_time')[0].text
}
print(data)
#get_links_from()
get_item_info()
我的总结
-
关于提取个人卖家信息,需要观察网站,以及寻找合适的标签。
点击上图的入口,然后观察网址的变化,可以看到“1”是代表商家,“0”是代表个人卖家。
list_view = 'http://bj.58.com/pbdn/{}/pn2/'.format(str(who_sells))
-
由js控制的浏览量应该怎么弄呢?(因为后来网站更新,浏览量不再由js控制了,所以提取更简单了)。
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
必须找到js控制的网址,然后比对和原来网址的联系,根据这种比对,就能实现从原网址到js网址的转换。当然有两个函数必不可少,分别是split和strip,split表示从某个标识分割网址,而strip则表示去掉某个部分。通过这种剪切,就能转到js网址了。
-
如果想要网址的标题,可以直接使用网址中head部分。
"title":soup.title.text
这就表示直接提取head中的标题。
-
可以直接寻找class部分,来指定地址。
'views': soup.select('span.look_time')[0].text
例如上面的语句,直接在审查部分搜索span.look_time,发现这个部分是唯一的,即可定位。隔了几行的class样式之间,不用 > 符号,直接空格表示即可。
另外,class样式中出现的 # 号,表示 id 的意思。想几个段落一起缩进的话,可以选择语句后,直接按 Tab键。
样式标签前方的 . 代表的是class的意思。 -
最后,在语句中也可以实现条件选择。
"cata": '个人' if who_sells == 0 else '商家'
用简单的 if ...... else ..... 语句即可实现。
当网页运行时,由于某个网页没有某些元素而导致错误时怎么办?
用 if ...... else None 。如果在网页里面不能find_all这些元素的话,就直接会显示为None.