说明原文连接【点我】
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的? 以后会了再更新。