美文网首页
Python实战计划学习笔记:爬取58同城的二手商品

Python实战计划学习笔记:爬取58同城的二手商品

作者: vampire_hunter | 来源:发表于2016-07-02 00:19 被阅读0次

    通过一周的学习可以爬取一些站点的页面内容了,虽然成功了但是还有很多不足的地方。

    获取到的数据

    我的代码~

    import requests
    import time
    from bs4 import BeautifulSoup
    
    def get_urls():
        # 获取商品列表中二手商品的url
        url      = 'http://bj.58.com/pbdn/1/'
        #设置UA,伪装成浏览器
        headers  = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'}
        #获取整页内容
        web_data = requests.get(url,headers=headers)
        #判断页面访问是否正常
        if  web_data.status_code != 200:
            return
        urls     = []
        #用来保存获取到的url的列表
        soup     = BeautifulSoup(web_data.text,'lxml')
    
        get_url  = soup.select('td.t a.t')
    
        for s_url in get_url:
            #获取url内容
            temp_url = s_url.get('href')
            #排除精品推广
            if 'http://jump.zhineng.58.com' in temp_url:
                continue
            #将获取到的url保存到列表中
            urls.append(temp_url)
        #返回url列表
        return urls
    
    #获取浏览次数http://bj.58.com/pingbandiannao/26400158299079x.shtml?psid=181695585192327315479369910&entinfo=26400158299079_0&iuType=p_1&PGTID=0d305a36-0000-153f-d3fc-3a0ff4f15bd7&ClickID=2
    def get_viws_from(url):
        #用/分割 取分割后列表中的倒数第一个 26400158299079x.shtml?psid=181695585192327315479369910&entinfo=26400158299079_0&iuType=p_1&PGTID=0d305a36-0000-153f-d3fc-3a0ff4f15bd7&ClickID=2
        url_path = url.split('/')[-1]
        #用x.shtml分割 取列表中第一个 26400158299079
        info_id  = url_path.split('x.shtml')[0]
        #找到调用JS的连接 将ID拼接上
        api      = 'http://jst1.58.com/counter?infoid={}'.format(info_id)
        #设置响应头 如果不设置这个JS中获取不到访问次数
        headers  = {
    
            'Accept'          : '*/*',
            'Accept-Encoding' : 'gzip, deflate, sdch',
            'Accept-Language' : 'Language:zh-CN,zh;q=0.8',
            'Cache-Control'   : 'max-age=0',
            'Connection'      : 'keep-alive',
            'Cookie'          : 'bj58_id58s="RXp5VkR1M21tM0tVMzc5OQ=="; id58=c5/njVd1wDpW16ToCtyxAg==; als=0; city=bj; 58home=bj; ipcity=cc%7C%u957F%u6625%7C0; sessionid=7d7a05c7-566c-4ee8-9a33-f9491ffc295f; __utma=253535702.545205630.1467371246.1467371246.1467371246.1; __utmc=253535702; __utmz=253535702.1467371246.1.1.utmcsr=bj.58.com|utmccn=(referral)|utmcmd=referral|utmcct=/pbdn/1/; myfeet_tooltip=end; 58tj_uuid=7dc55421-36df-4bfa-a534-0f7dd003862d; new_session=0; new_uv=3; utm_source=; spm=; init_refer=; final_history={}%2C26342559128371; bj58_new_session=0; bj58_init_refer=""; bj58_new_uv=3'.format(str(info_id)),
            'Host'            : 'jst1.58.com',
            'Referer'         : 'http://bj.58.com/pingbandiannao/{}x.shtml'.format(info_id),
            'User-Agent'      : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'
        }
    
        wb_data = requests.get(api,headers=headers)
        #判断是否可以正常访问
        if wb_data.status_code == 200:
            return  wb_data.text.split('=')[-1]
        return 0
    
    #获取页面中的内容
    def get_item_info(url):
    
        web_data  = requests.get(url)
        soup      = BeautifulSoup(web_data.text,'lxml')
        #获取类目
        category  = soup.select('.crb_i') #header > div.breadCrumb.f12
        #获取价格
        prices    = soup.select('.price')
        #获取区域
        areas     = soup.select('.c_25d')
        #获取时间
        time      =  soup.select('.time')
        #获取成色
        condition = soup.select('div.col_sub.sumary  span')
    
        data = {
            'category'    : category[1].text,
            'title'       : soup.title.text,
            'prices'      : prices[0].text if len(prices) > 0 else 0,
            'areas'       : list(areas[0].stripped_strings) if len(areas) > 0 else 0,
            'time'        : time[0].text,
            'views'       : get_viws_from(url),
            'condition'   : condition[1].text.strip()
    
        }
    
        print(data)
    
    urls = get_urls()
    
    for url in urls:
        time.sleep(2)
        get_item_info(url)
    

    目前的成果是这样的,算是完成作业吧,个人中的商品全都是转转了,所以只抓取了商家的内容。在获取url列表部分,通过select获取到的是精品推荐和正常商品,由于精品推荐的域名不同,直接通过域名判断排除了,没找到怎么通过select直接获取的方法。没有继续获取下一页商品列表内容,观察连接,url通过/pn*/来控制翻页的,获取下页列表通过循环应该就可以。部分代码是参照老师的代码写的,第一周的作业先这样吧~

    相关文章

      网友评论

          本文标题:Python实战计划学习笔记:爬取58同城的二手商品

          本文链接:https://www.haomeiwen.com/subject/nukqjttx.html