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

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

Python实战计划学习笔记:爬取58同城的二手商品_第1张图片
获取到的数据

我的代码~

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同城的二手商品)