学习了几天的Python爬虫,写了一段代码爬取某东三星手机自营店数码产品数据作数据分析使用,仅供参考学习,转载请注明网址
废话不多说直接上代码。
import requests from lxml import etree from bs4 import BeautifulSoup import json import pandas as pdif __name__ == "__main__": url = "https://mall.jd.com/index-1000003443.html" //传入分类的url地址 headers = { "user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400" //UA伪装,在浏览器F12中可以找到 } page_text = requests.get(url=url,headers=headers).text //用requests方法进行数据解析 tree = etree.HTML(page_text) //构造了一个XPath解析对象并对HTML文本进行自动修正 sanxing_url_list = tree.xpath('//div[@class="user-jy47ding"]/ul/li') //解析div[@class="user-jy47ding"]下所有ul标签下的li标签 https_url = 'https:' //定义一个变量,用于循环后拼接字符串成网址 sanxing_classity_url = [] //定义一个空数组,留作存放数据 result = [] //定义用于存放数据的空数组 for li in sanxing_url_list: //循环上面解析出的li的标签 sanxing_url = li.xpath('./a/@href') //解析出每个li下面的@href中的商品编码 for i in range(len(sanxing_url)): //循环取出每一个商品编码 sanxing_new_url = https_url + sanxing_url[i] //拼接字符串组合成新的网址链接 sanxing_classity_url.append(sanxing_new_url) //将得到的新链接append到sanxing_classity_url空数组中转成全局变量 for new_url in sanxing_classity_url: //从sanxing_classity_url中取出每个链接 detail_url = requests.get(url=new_url, headers=headers).text //循环对每个链接都解析。ps:此处没有用线程处理,因为还不怎么会用线程 soup = BeautifulSoup(detail_url, 'html.parser').select_one('script').string.replace('/**/', '') //返回每个链接被解析后的第一个script,因为这个script中包含了我们想要的名称,型号等数据 soup = ('\n'.join(soup.split('\n')).replace('var pageConfig =', '').split('try')[0]).strip()[:-1] //将script中的开头和结尾的乱数据替换掉 colorSize = eval(soup, type('Dummy', (dict,), dict(__getitem__=lambda s, n: n))())['product']['colorSize'] //取出可选择的版本 venderId = eval(soup, type('Dummy', (dict,), dict(__getitem__=lambda s, n: n))())['product']['venderId'] //取到手机编码,代表每个颜色的编码 result_info = [('https://item.jd.com/%s.html__%s' % (tmp['skuId'], venderId)) for tmp in colorSize] //组合成每个版本+编码的新链接 for res in result_info: result_name = res.split('.com/')[1] result_name = result_name.split('.html')[0] res1 = res.split("__")[0] //截取相关数据 detail_url_sanxing = requests.get(url=res1, headers=headers).text //用requests方法进行数据解析 soup = BeautifulSoup(detail_url_sanxing, 'html.parser') //用来解析HTML文件 try: title = soup.select_one('div.item.ellipsis').text //取出名称 color = soup.select('div.item.selected')[0]['data-value'] //取出颜色 type1 = soup.select('div.item.selected')[1]['data-value'] //取出内存组合 except: type1 = '此手机没有任何型号' strat_url1 = "https://item-soa.jd.com/getWareBusiness?callback=jQuery3664178&skuId=frist_one&cat=9987%2C653%2C655&area=1295934060&shopId=1000003443&venderId=1000003443¶mJson=%7B%22platform2%22%3A%22100000000001%22%2C%22specialAttrStr%22%3A%22p0ppppppppp2p1pppppppppp%22%2C%22skuMarkStr%22%3A%2200%22%7D&num=1" //包含价格是url连接 data1 = res1.replace('https://item.jd.com/', '') //将连接字符串中的前部https://item.jd.com去掉,拿到商品编码数据 price_url = strat_url1.replace('frist_one', data1.split('.html')[0]) //将连接中的frist_one数据替换成真实手机商品编码数据 p1 = (requests.get(url=price_url, headers=headers).text)[14:-1] //析获得到的json数据 data2 = float(json.loads(p1)['price']['p']) //将json格式数据转换为字典,取出价格数据 res = (title + '/' + color + '/' + type1 + '/' + str(data2) + '/'+ res1).split('/', 4) //拼接名称、颜色、内存组合、价格、购买链接 print(res) //打印拼接好的数据 result.append(res) //将数据放入result空数组中,转成全局变量 print(result) //打印拼接好存在result中的数据 tmp_data = pd.DataFrame(result, columns=['名称', '颜色', '内存组合', '价格', '购买链接']) //设定存入表格的表头 tmp_data.dropna(axis=0, how='any', inplace=True) //处理确实数据 writer = pd.ExcelWriter('D:\*****\*****\*****.xlsx') //需要将文件保存的文件夹 tmp_data.to_excel(writer, 'page1', float_format='%.5f', index=False) //将数据写入表格中 writer.save() //数据保存 writer.close() //关闭编写器
以上代码复制即可爬取数据。但此代码并未使用多线程爬取,加载稍稍有点慢。
欢迎大家留言讨论,不足地方还请批评指正 ,谢谢!
作者原创, 转载请注明
版权声明:本文为weixin_41609935原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。