爬取瓜子网上海地区二手车的信息【python】

说明原文连接【点我】

1、在原文基础上稍作修改,目标地区为上海,更改了网址显示和价格显示部分。并增加了数据库导入,请把密码XXXX修改为你的密码。

2、本文亮点在网址分析处,使用了CSS path,目前在谷歌浏览器下显示为Copy selector ,这和原文的Copy CSS Path是不同的,就本文,这个分析方法完全避开了正则式,从中,也体现了bs4的强大。

3、代码:

# -*- coding: utf-8 -*-
# python 3.5.2

from bs4 import BeautifulSoup
import requests
import pymysql.cursors

def detailOper(url):
    web_data = requests.get(url)
    # soup = BeautifulSoup(web_data.text, 'lxml')
    soup = BeautifulSoup(web_data.text, 'html.parser')

    # body > div.w > div.list > ul > li:nth-child(1) > div > p.infoBox > a
    # above is the css path , or copy selector in Google Chrome F12
    # we can delete "body > div.w >" as the whole site under Class = 'w'
    # modify it for all cars info: div.list > ul > li > div > p.infoBox > a
    titles = soup.select('div.list > ul > li > div > p.infoBox > a')

    # get price info with F12: body > div.w > div.list > ul > li:nth-child(1) > div > p.priType-s > span > i
    # modify it for all price: div.list > ul > li > div > p.priType-s > span > i
    prices = soup.select('div.list > ul > li > div > p.priType-s > span > i')
    for title, price in zip(titles, prices):
        data = {
        '车型': title.get_text(),
        '网址': 'http://www.guazi.com'+ title.get('href'),
        #'price':price.get_text().replace(u'万', '').replace(' ', '')
        '价格': price.get_text().replace('\n', '').replace(' ', '')
    }

        connection = pymysql.connect(host='localhost',
                                     user='root',
                                     password='XXXX',
                                     db='guazi',
                                     charset='utf8'
                                     )

        try:
            # 创建会话指针
            with connection.cursor() as cursor:
                # 创建sql语句
                sql = 'insert into `guazi1` (`车型`, `价格`, `网址`) values(%s, %s, %s)'
                # 执行sql语句
                cursor.execute(sql, (data['车型'], data['价格'],data['网址']))

                # 提交
                connection.commit()

        finally:
            connection.close()
    # print(data)

def start():
    urls = ['http://www.guazi.com/sh/buy/o{}/'.format(str(i)) for i in range(1, 51, 1)]
    for url in urls:
        detailOper(url)

if __name__ == '__main__':
    start()

4、部分结果展示:

{'车型': '东南V5菱致 2013款 1.5 手动 舒适型CNG', '价格': '已降价', '网址': 'http://www.guazi.com/sh/3000216790x.htm'}
{'车型': '福特蒙迪欧 2013款 致胜 2.3 自动 时尚型', '价格': '9.00万', '网址': 'http://www.guazi.com/sh/3000237200x.htm'}
{'车型': '斯柯达明锐 2010款 明锐 1.6 手动 逸致版', '价格': '3.80万', '网址': 'http://www.guazi.com/sh/3000222224x.htm'}
{'车型': '大众速腾 2014款 速腾 1.4TSI 手动 豪华型', '价格': '已降价', '网址': 'http://www.guazi.com/sh/3000415677x.htm'}
{'车型': '福特蒙迪欧 2011款 蒙迪欧致胜 2.3 自动 时尚型', '价格': '3.99万', '网址': 'http://www.guazi.com/sh/3000218992x.htm'}
{'车型': '大众CC2015款 CC 1.8TSI 双离合 豪华型', '价格': '已降价', '网址': 'http://www.guazi.com/sh/3000431976x.htm'}
{'车型': '大众Polo2014款 1.6 自动 舒适版', '价格': '19.50万', '网址': 'http://www.guazi.com/sh/3000428176x.htm'}
{'车型': '吉利GX7 2013款 1.8 手动 尊贵型', '价格': '已降价', '网址': 'http://www.guazi.com/sh/3000215362x.htm'}
{'车型': '标致3008 2013款 1.6THP 自动 至尚版', '价格': '8.10万', '网址': 'http://www.guazi.com/sh/3000240867x.htm'}
{'车型': '比亚迪F3 2010款 1.5 手动 新白金版 GLX-i 豪华型', '价格': '4.50万', '网址': 'http://www.guazi.com/sh/3000205737x.htm'}
{'车型': '五菱荣光S 2014款 1.2 手动 标准型7-8座', '价格': '9.98万', '网址': 'http://www.guazi.com/sh/3000243019x.htm'}

5、导入到了mysql中,看起来更方便。如果需要对数据进一步操作,可以在数据库中进行相关排序,如下图:

6、本文可拓展点: 有的价格抓取是 已降价,但不知道降价后的价格, 只抓了上海地区的,如果是想全国地区的,研究了网页代码,css path都是body > div.header > div.hd-top.clearfix > div.c2city > a > span 里面没有具体的城市名字,也许是用ajax的? 以后会了再更新。