Python实战课程第一周第9课:第一周大作业-提取58同城出售电脑的所有信息

本周最后一节课了,这大作业比较综合,要在页面上提取网址,然后根据提取到的网址,进行解析,提取每个网址上面的有效信息,例如标题、时间、地址、价格、浏览量等。

难点主要有:

  1. 要提取个人用户发布的信息,而非商家的。
  2. 浏览量由js控制,要找到js的网址才行。
  3. 有些页面没有地址信息,这会导致程序运行中断。

我的成果

成果.png

我的代码

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. 关于提取个人卖家信息,需要观察网站,以及寻找合适的标签。

    Paste_Image.png

    点击上图的入口,然后观察网址的变化,可以看到“1”是代表商家,“0”是代表个人卖家。
    list_view = 'http://bj.58.com/pbdn/{}/pn2/'.format(str(who_sells))

  2. 由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网址的转换。当然有两个函数必不可少,分别是splitstrip,split表示从某个标识分割网址,而strip则表示去掉某个部分。通过这种剪切,就能转到js网址了。

  3. 如果想要网址的标题,可以直接使用网址中head部分。

    "title":soup.title.text

    这就表示直接提取head中的标题。

  4. 可以直接寻找class部分,来指定地址。

    'views': soup.select('span.look_time')[0].text

    例如上面的语句,直接在审查部分搜索span.look_time,发现这个部分是唯一的,即可定位。隔了几行的class样式之间,不用 > 符号,直接空格表示即可。

    另外,class样式中出现的 # 号,表示 id 的意思。想几个段落一起缩进的话,可以选择语句后,直接按 Tab键。
    样式标签前方的 . 代表的是class的意思。

  5. 最后,在语句中也可以实现条件选择。

    "cata": '个人' if who_sells == 0 else '商家'

    用简单的 if ...... else ..... 语句即可实现。

    当网页运行时,由于某个网页没有某些元素而导致错误时怎么办?

else none.png

用 if ...... else None 。如果在网页里面不能find_all这些元素的话,就直接会显示为None.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 经朋友介绍,认识到了python实战:四周实习爬虫系统,然后看了一下试看教程,觉得课程挺不错的,→_→重点是对于...
    隐逆阅读 795评论 0 50
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,253评论 19 139
  • 雨水的记忆 被皮鞋的质量擦淡 晴天的闪电不时划破夜空 那几年 甘谷麦子收了就种豆 渠里没水 天上一碧如洗 地里一镢...
    清水濯足阅读 213评论 0 1
  • uu07阅读 159评论 0 2