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

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

难点主要有:

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

我的成果

Python实战课程第一周第9课:第一周大作业-提取58同城出售电脑的所有信息_第1张图片
成果.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. 关于提取个人卖家信息,需要观察网站,以及寻找合适的标签。

    Python实战课程第一周第9课:第一周大作业-提取58同城出售电脑的所有信息_第2张图片
    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实战课程第一周第9课:第一周大作业-提取58同城出售电脑的所有信息)