校园实训--Python篇

    科技2022-08-11  103

    本次实训是利用python爬取一个网站的数据,然后进行可视化分析,在这里进行总结。

    一、爬取汽车用户消费投诉案例

    代码:

    import requests from lxml import etree import math import random import pandas as pd #创建随机的user—Agent,防止封号 ua_list = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)', ] #加载页面 def loadPage(url): userAgent = random.choice(ua_list) headers = { 'User-Agent': userAgent } req = requests.get(url, headers=headers) html = req.content.decode('utf-8') content = etree.HTML(html) brand_name = content.xpath('//div[@class="row clearfix tousu-brand-list"]/a//text()') #品牌名称 brand_link = content.xpath('//div[@class="row clearfix tousu-brand-list"]/a/@href') #品牌网页 ind = brand_link.index('javascript:;') #剔除非链接元素 del brand_link[ind] del brand_name[ind] # for link in brand_link: # loadtousuPage(link) loadtousuPage(brand_link[0]) #爬取投诉网址 def loadtousuPage(url): req = requests.get(url) html = req.content.decode('utf-8') content = etree.HTML(html) counts = content.xpath('/html/body/div[1]/div[2]/div[2]/div[1]/div[2]/div[1]/span/em/text()') #投诉宗数 pages = math.ceil(int(counts[0])/9) #投诉页数 for page in range(1, 5): link = url + '0/0/0/' + str(page) +'.htm' # 投诉页数链接 loadTsPage(link) #进去投诉网站 def loadTsPage(url): req = requests.get(url) html = req.content.decode('utf-8') content = etree.HTML(html) tousu_list = content.xpath('//div[@class="tousu-filter-list"]/ul/li/a/@href') # 投诉链接 for link in tousu_list: loadTSPage(link) #打开投诉网址,爬取里面的内容 def loadTSPage(url): req = requests.get(url) html = req.content.decode('utf-8') content = etree.HTML(html) brand = content.xpath('/html/body/div[1]/div[2]/div[1]/a[3]/text()') # 品牌 neirong = content.xpath('/html/body/div[1]/div[2]/div[2]/div[1]/div[1]/div/div[1]/p/text()') # 投诉内容 model = content.xpath('/html/body/div[1]/div[2]/div[2]/div[1]/div[1]/div/div[3]/p[1]/text()') # 车牌型号 number = content.xpath('/html/body/div[1]/div[2]/div[2]/div[1]/div[1]/div/div[3]/p[2]/text()') # 单号 problem = content.xpath('/html/body/div[1]/div[2]/div[2]/div[1]/div[1]/div/div[3]/p[3]/text()') # 问题 time = content.xpath('/html/body/div[1]/div[2]/div[2]/div[1]/div[1]/div/div[3]/p[4]/text()') # 时间 store = content.xpath('/html/body/div[1]/div[2]/div[2]/div[1]/div[1]/div/div[3]/p[5]/text()') # 商家 data = pd.DataFrame({'品牌名称': brand, '投诉内容': neirong, '车牌型号': model, '单号': number, '问题': problem, '时间': time, '商家': store }) print(data) #输出爬取的内容 if __name__ == '__main__': url = 'http://tousu.315che.com/tousulist/serial/55467/' loadPage(url)

    这里只爬取了第一个品牌的前五页内容,想要爬取全部内容修改如下:

    #改这里 for link in brand_link: loadtousuPage(link) # loadtousuPage(brand_link[0]) #和这里 pages = math.ceil(int(counts[0])/9) #投诉页数 for page in range(1, pages+1):

    如果爬取全部内容可能在爬取过程中出现停止的情况,这是正常情况,因为这个网站有反爬虫,所以建议还是不要爬取全部内容。但是实训要求要爬取全部内容,所以 要把user-Agent的随机数量变的更多,这样爬取全部数据的可能性更大。

    运行截图:

    由于输出结果一条的数据太多所以这里用省略号代替了。

    好了,无论是爬取什么网站都可以在这基础上进行修改,最后只要把爬取到的内容保存到excel表就行了。

    Processed: 0.028, SQL: 8