Python 爬虫实战入门——爬取汽车之家网站促销优惠与经销商信息
在4S店实习,市场部经理让我写一个小程序自动爬取汽车之家网站上自家品牌的促销文章,因为区域经理需要各店上报在网站上每一家经销商文章的露出频率,于是就自己尝试写一个爬虫,正好当入门了。
一、自动爬取并输出促销信息与经销商信息到CSV表格
(1)配置环境
电脑上已经安装了Anaconda3 4.2.0,集成了python3.5.2,以及pandas、numpy等数据处理与科学计算模块。
在命令行中用 pip install 安装bs4
如
pip install bs4
(2)思路
http://www.autohome.com.cn/chengdu/cheshi/
对象是上面这个网站,打开后可以看到有不同品牌的促销文章,进入其中一个链接,http://www.autohome.com.cn/dealer/201706/118192201.html
翻到最底下,可以看到“商家名称”一栏后有对应的商家名称“四川知行荣业汽车销售服务有限公司”,要找的就是它。
每一个促销信息的网页结构都是一致的。这就有规律可寻。
在Firefox浏览器中,对应区域——右键——查看元素,定位到某个标题的位置
在下方的查看器中,根据结构找到这个促销信息区域的结构。
能够看到是<div class="news_area">的标签。根据这个标签,就能够定位到相应的文本内容中。
采用了BeautifulSoup库,是一个可以从HTML或XML文件中提取数据的Python库。具体文档介绍:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
在导入对应的库后,首先发送网页请求并解析
html = urllib.request.urlopen("http://www.autohome.com.cn/chengdu/cheshi/") #发送打开网页请求
soup = BeautifulSoup(html, "lxml") #解析网页
根据标签的结构,定位到相应促销区域:
先上这部分代码:
for i in soup.body.find_all("div",attrs={"class":"news_area"}): #定位到优惠促销区域k=0 #k用于统计促销信息数量df = pd.DataFrame(np.empty((len(i.find_all('a')),2))) #df用于存储所有信息for j in i.find_all('a'):result = j.get_text() result = "".join(result) #将列表转化为字符串df.ix[k,0] = result #第k行第一列为标题df.ix[k,1] = j['href'] #第k行第二列为对应网址k += 1
df.columns = ['标题','链接'] #结果表格列名
df.to_csv('D:\\所有优惠信息.csv',index = False) #输出总结果
采用soup.find_all 函数(用法见文档说明)
soup.body.find_all("div",attrs={"class":"news_area"})
如果在body标签内有多条'div'标签,用上述的函数只会输出第一条,但是如果写一个循环,就可以全部找出来,所以在这里要写一个循环。
对找出来的子结构再进行分析,发现'a' 标签代表一条促销信息,如
“<a href="http://dealer.autohome.com.cn/2020446" target="_blank">成都宝源汽车销售服务有限公司</a>
<a href="http://www.autohome.com.cn/dealer/201706/118562405.html#pvareaid=101707" target="_blank">众泰SR9目前价格稳定 售价10.88万元起</a>,
<a href="http://www.autohome.com.cn/dealer/201706/118562169.html#pvareaid=101707" target="_blank">购讴歌MDX目前暂无优惠</a>,
<a href="http://www.autohome.com.cn/dealer/201706/118562171.html#pvareaid=101707" target="_blank">高尔夫目前售价12.89万起</a>,”
对于优惠信息,创建一个pandas 库中的 DataFrame 来存储每一条记录,第一列为标题,第二列为对应的链接。由于DataFrame需要事先确定行数,实现计算好条目数。
(len(i.find_all('a'))
同上,.find_all()函数需写一个循环遍历所有结果。
用.get_text()来获得纯文本作为标题,注意需要将获得的文本转化为字符串。参考上面的信息,网址在'href'标签里,直接用 j['href'] 提取。至此,标题、网址都已得到。
在循环中引入k计数,逐行向下记录。
在df 表格记录完成后,重命名列名,然后保存到csv格式表格中,方便查看。
接下来就是在df表格中寻找需要品牌的关键字,以“荣威”为例。
基本思路就是在df的第一列中逐行向下检索,看有没有'荣威'字符,如果有,打开对应行第二列的网址,在进行解析,定位到经销商处,提取出经销商名称。
直接上代码。
data = pd.DataFrame(np.empty((1,3))) #data用于存储荣威经销商
for x in range(len(df)):if '荣威' in df.ix[x,0]: #查找优惠标题中是否有荣威URL = urllib.request.urlopen(df.ix[x,1]) #打开有荣威字段的网页SOUP = BeautifulSoup(URL, "lxml") #解析网页for i in SOUP.find_all("div",attrs={"class":"seller-add"}): #定位到经销商信息for j in i.find_all('a'):tempdata = pd.DataFrame(np.empty((1,3))) #tempdata变量存储每条荣威优惠信息tempdata.ix[0,0] = df.ix[x,0] #第一列为标题tempdata.ix[0,1] = df.ix[x,1] #第二列为网址tempdata.ix[0,2] = j.get_text() #第三列为经销商data = data.append(tempdata) #将tempdata的记录合并到data中去data.index = range(len(data)) #统计data共有几行
data = data.drop(0) #去掉空白的第一行
data.columns = ['标题','网址','经销商'] #改变列名
data.to_csv('D:\\荣威经销商优惠.csv',index = False) #输出最后结果
如果判断出某一行中带有关键字,打开对应的网址,接下来的操作类似上一部分,定位到经销商信息,在一个新的DataFrame中保存经销商名字,最后对表格进行规整并输出。
最后输出两个csv文件,分别是当前所有经销商的信息,以及只含关键品牌的信息。
完整代码如下:
# -*- coding: utf-8 -*-
'''
Created on Wed Jun 7 20:07:12 2017@author: gusiev平台:anaconda 64位版 python 3.5作用:打开汽车之家特定网页,提取网页中也定的优惠信息文章。
在优惠信息文章中找到‘荣威’关键字的文章,在对应的文章内找到
经销商的名称。可用于统计经销商的促销文章在网站的推送频次。'''import urllib
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import os os.chdir('D:\\') #变更工作目录html = urllib.request.urlopen("http://www.autohome.com.cn/chengdu/cheshi/") #发送打开网页请求
soup = BeautifulSoup(html, "lxml") #解析网页for i in soup.body.find_all("div",attrs={"class":"news_area"}): #定位到优惠促销区域k=0 #k用于统计促销信息数量df = pd.DataFrame(np.empty((len(i.find_all('a')),2))) #df用于存储所有信息for j in i.find_all('a'):result = j.get_text().split(',') #优惠信息分隔result2 = "".join(result) #将列表转化为字符串df.ix[k,0] = result2 #第k行第一列为标题df.ix[k,1] = j['href'] #第k行第二列为对应网址k += 1
df.columns = ['标题','链接'] #结果表格列名
df.to_csv('D:\\所有优惠信息.csv',index = False) #输出总结果data = pd.DataFrame(np.empty((1,3))) #data用于存储荣威经销商
for x in range(len(df)):if '荣威' in df.ix[x,0]: #查找优惠标题中是否有荣威URL = urllib.request.urlopen(df.ix[x,1]) #打开有荣威字段的网页SOUP = BeautifulSoup(URL, "lxml") #解析网页for i in SOUP.find_all("div",attrs={"class":"seller-add"}): #定位到经销商信息for j in i.find_all('a'):tempdata = pd.DataFrame(np.empty((1,3))) #tempdata变量存储每条荣威优惠信息tempdata.ix[0,0] = df.ix[x,0] #第一列为标题tempdata.ix[0,1] = df.ix[x,1] #第二列为网址tempdata.ix[0,2] = j.get_text() #第三列为经销商data = data.append(tempdata) #将tempdata的记录合并到data中去data.index = range(len(data)) #统计data共有几行
data = data.drop(0) #去掉空白的第一行
data.columns = ['标题','网址','经销商'] #改变列名
data.to_csv('D:\\荣威经销商优惠.csv',index = False) #输出最后结果
二、输出带经销商信息的网页截图
在第一部分的基础上有稍微增加了一个对关键字经销商信息的网页进行截屏的功能,采用selenium 库完成,可调用Firefox浏览器自动打开对应促销网页并截图保存到本地。
import urllib
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import os
from selenium import webdriver
import timeos.chdir('D:\\code\\roewe\\') #变更工作目录def capture(url, save_fn="capture.png"):browser = webdriver.Firefox() # Get local session of firefoxbrowser.maximize_window()browser.get(url) # Load pagebrowser.save_screenshot(save_fn)browser.close()html = urllib.request.urlopen("http://www.autohome.com.cn/chengdu/cheshi/") #发送打开网页请求
soup = BeautifulSoup(html, "lxml") #解析网页for i in soup.body.find_all("div",attrs={"class":"news_area"}): #定位到优惠促销区域k=0 #k用于统计促销信息数量df = pd.DataFrame(np.zeros((len(i.find_all('a')),2))) #df用于存储所有信息for j in i.find_all('a'):result = j.get_text().split(',')result2 = "".join(result) #将列表转化为字符串df.ix[k,0] = result2 #标题df.ix[k,1] = j['href'] #对应网址k += 1
df.columns = ['标题','链接'] #结果表格列名
df.to_csv('所有优惠信息.csv',index = False)data = pd.DataFrame(np.empty((1,3))) #data用于存储荣威经销商
for x in range(len(df)):if '荣威' in df.ix[x,0]:URL = urllib.request.urlopen(df.ix[x,1])capture(df.ix[x,1])SOUP = BeautifulSoup(URL, "lxml")for i in SOUP.find_all("div",attrs={"class":"seller-add"}): #定位到经销商信息for j in i.find_all('a'):tempdata = pd.DataFrame(np.empty((1,3)))tempdata.ix[0,0] = df.ix[x,0]tempdata.ix[0,1] = df.ix[x,1]tempdata.ix[0,2] = j.get_text()data = data.append(tempdata)data.index = range(len(data))
data = data.drop(0)
data.columns = ['标题','网址','经销商']
data.to_csv('荣威经销商优惠.csv',index = False)
完成效果
表格文件
截图
后记
这是本人第一篇技术博客,由于也是初学者,所以代码难免有疏漏,望包涵,个人检测可运行。
Python 爬虫实战入门——爬取汽车之家网站促销优惠与经销商信息相关推荐
- python爬取汽车之家_python爬虫实战之爬取汽车之家网站上的图片
随着生活水平的提高和快节奏生活的发展.汽车开始慢慢成为人们的必需品,浏览各种汽车网站便成为购买合适.喜欢车辆的前提.例如汽车之家网站中就有最新的报价和图片以及汽车的相关内容,是提供信息最快最全的中国汽 ...
- Python3[爬虫实战] scrapy爬取汽车之家全站链接存json文件
昨晚晚上一不小心学习了崔庆才,崔大神的博客,试着尝试一下爬取一个网站的全部内容,福利吧网站现在已经找不到了,然后一不小心逛到了汽车之家 (http://www.autohome.com.cn/beij ...
- [Python爬虫实战2]爬取济南安居客网站上所需街区的二手房平均房价数据
文章目录 一.项目简介 二.安居客网页分析 1.整体分析 2.细节分析 2.1提取一个页面所有的房源信息 2.2提取每个房源信息中的信息 2.3如何爬取下一页的房源信息 三.程序编写 1.数据去重 2 ...
- python3 爬虫 全站_Python3[爬虫实战] scrapy爬取汽车之家全站链接存json文件
昨晚晚上一不小心学习了崔庆才,崔大神的博客,试着尝试一下爬取一个网站的全部内容,福利吧网站现在已经找不到了,然后一不小心逛到了汽车之家 (http://www.autohome.com.cn/beij ...
- python爬虫实战:爬取西刺代理网站,获取免费的代理IP
爬取的网站链接:西刺网站 import requests import chardet import random import time from bs4 import BeautifulSoup ...
- 携程ajax,Python爬虫实战之爬取携程评论
一.分析数据源 这里的数据源是指html网页?还是Aajx异步.对于爬虫初学者来说,可能不知道怎么判断,这里辰哥也手把手过一遍. 提示:以下操作均不需要登录(当然登录也可以) 咱们先在浏览器里面搜索携 ...
- Python爬虫实战之爬取糗事百科段子
Python爬虫实战之爬取糗事百科段子 完整代码地址:Python爬虫实战之爬取糗事百科段子 程序代码详解: Spider1-qiushibaike.py:爬取糗事百科的8小时最新页的段子.包含的信息 ...
- Python爬虫实战之爬取百度贴吧帖子
Python爬虫实战之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的 ...
- Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(下)
在Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(上)中,我们最后爬出来的结果不是很完美,这对于"精益求精.追求完美的"程序猿来说怎么能够甘心 所以,今天,用pyth ...
最新文章
- HJ107 二分法求求解立方根
- CUDA C++程序设计模型
- 深入探讨PHP中的内存管理问题
- GoLang笔记-数组和切片,本质是就是长度不可变的可变的区别
- Leetcode::Balanced Binary Tree
- js 替换任意字符串中间几位为*星号
- 关于html-三角的制作
- 深度拷贝 java_java 深度拷贝 复制 深度复制
- 平稳时间序列分析:ARMA模型
- win7电脑怎么录屏?如何使用电脑录屏软件
- Excel 函数 自定义规则 VBA 实现 实时 语音 声音 提示 功能 股票 数据 资料 获取 盯盘 助手 K线图 模板
- 支付宝 手机页面支付 集成 出现 “系统繁忙,请稍后再试”
- 著名企业求职面试指南
- pandas 数据读取与保存
- 不惧年龄,无限可能,32岁也能成功转行IT行业
- 自学java可以吗?难吗?
- win10恢复经典开始菜单_没有蜘蛛纸牌的日子怎么过?带你找回Win10自带的游戏...
- Win7运行程序时弹出“windows防火墙安全警报“的解决方法
- 记一个转行程序员的工作经历与感想(一)
- 信息项目管理师计算机公式,(最新整理)信息系统项目管理师九个公式计算题