第一篇CSDN博客——python爬虫爬取淘宝

目的:

利用python实现爬取淘宝某具体商品信息,再将其数据实现持久化。

实现结果如图:


开始前:

环境:python3

第三方模块:requests,matplotlib,xlwt

IDE:PYCHARM

浏览器:Chrome

这些安装全部跳过,直接来干货!!!

先来一波概念

网络爬虫:

用于模拟浏览器进行批量爬取我们需要的数据的一个程序或代码段(认为不对欢迎指正)

说是一波其实也就只有一条

下面正式开始:

1、我们先在淘宝搜索关键字:python(这个随意),获取我们这次爬取的url

url = 'https://s.taobao.com/search?q=python&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20180430&ie=utf8'

这个url不一定是网页的地址栏的,当然,相同的关键字的url都不一定相同,不一样的关键字的url更不同。可以按F12对该网页进行一个简单的“抓包”(应该算不上真正意义的抓包)

2、发送http请求,这时候需要requests,获取源码进行分析

import requests
#http请求
response = requests.get(url)
#html源码
html = response.text

3、通过部分源码我们不难发现,里面的内容符合json格式。可用正则表达式将内容提取出来。


4、分析找出信息,并且格式化json。

import re
content = re.findall(r'g_page_config = (.*?) g_srp_loadCss',html,re.S)[0].strip()[:-1]
#格式化
content = json.loads(content)

5.提取数据。将获取的json格式的数据放到json解析的网页中进行解析分析点击打开链接

此时我们创建一个data_list对象,用于数据的提取,并且定义一个全局字典DATA[],用for循环将data_list的数据进行提取。冒号前面为自定义,后面的为源码里面相应的标签。最后用方法append()将其添加到字典里。

#获取信息列表
data_list = content['mods']['itemlist']['data']['auctions']

#提取数据
for item in data_list:
    temp = {
        'title':item['title'],
        'view_price':item['view_price'],
        'view_sales':item['view_sales'],
        'view_fee': '否' if float(item['view_fee'])else '是',
        'isTmall':'是'  if item['shopcard']['isTmall'] else '否',
        'area': item['item_loc'],
        'name':item['nick'],
        'detail_url':item['detail_url'],
    }
    DATA.append(temp)

6、通过print(len(DATA))我们不难发现我们只爬取到了36条数据,原本整个页面是有48条数据。这里就关系到了消息的加载方式:同步和异步。前面的36条数据是随网页一同加载,也就是同步加载的,后面12条是通过异步进行加载的,所以我们需要再次对后面的数据进行分析。下图不难发现刚好有12条数据是符合我们的要求的,也就是之前我们没有爬取下来的数据。

接下来需要模拟一下浏览器的请求,做一下cookie保持(有些需要cookie验证),然后再用正则表达式。

#cookie保持
cookies = response.cookies
#首页12条异步
url2 = 'https://s.taobao.com/api?_ksTS=1524836494360_224&callback=jsonp225&ajax=true&m=customized&sourceId=tb.index&q=python&spm=a21bo.2017.201856-taobao-item.1&s=36&imgfile=&initiative_id=tbindexz_20170306&bcoffset=-1&commend=all&ie=utf8&rn=efedc6cda629c8a38008aff6f017b934&ssid=s5-e&search_type=item'

response2 = requests.get(url2,cookies=cookies)
html2=response2.text

content = re.findall(r'{.*}',html2)[0]

获取到的12条数据的处理方式于上面的36条的方式也相同。我们先专注于爬取的思路,代码的雍余可在后期进行优化,我们还是将其加入到DATA字典中。

#格式化
content = json.loads(content)
data_list = content['API.CustomizedApi']['itemlist']['auctions']
#提取
for item in data_list:
    temp = {
        'title':item['title'],
        'view_price':item['view_price'],
        'view_sales':item['view_sales'],
        'view_fee': '否' if float(item['view_fee'])else '是',
        'isTmall':'是'  if item['shopcard']['isTmall'] else '否',
        'area': item['item_loc'],
        'name':item['nick'],
        'detail_url':item['detail_url'],
    }
    DATA.append(temp)

7、下面就是进行翻页的操作了,我们在浏览器翻页操作时,浏览器发送了请求。

我们找到了翻页请求的url,将其提取出来,进行分析。


url = 'https://s.taobao.com/search?data-key=s&data-value=44&ajax=true&_ksTS=1525143958908_907&callback=jsonp908&q=python&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&bcoffset=3&ntoffset=0&p4ppushleft=1%2C48'

进行下次翻页该url是有规律可循的,其主要变量在data-value、时间戳_ksTS以及callback,因此要进行翻页模拟需要引入time。这里同样需要cookie保持,我们先获取10页的数据用方法range(1,10)在for循环里对翻页地址进行拼接,翻页完成后自然就是数据提取,上面有提,这里就不在赘述。

import time
#翻页
cookies=response2.cookies

for i in range(1,10):
    ktsts = time.time()
    _ksTS = '%s_%s' % (int(ktsts*1000),str(ktsts)[-3:])
    callback = "jsonp%s" % (int(str(ktsts)[-3:])+1)
    data_value = 44*i
    url = 'https://s.taobao.com/search?data-key=s&data-value={}&ajax=true&_ksTS={}&callback={}&q=python&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&bcoffset=0&ntoffset=6&p4ppushleft=1%2C48&s=44'.format(data_value,_ksTS,callback)

8、数据持久化。将数据爬取到本地并以Excel格式存储,需要引入xlwt。

import xlwt
#持久化
f = xlwt.Workbook(encoding='utf-8')
sheet01 = f.add_sheet(u'sheet1',cell_overwrite_ok=True)
#写标题

sheet01.write(0,0,'标题')
sheet01.write(0,2,'标价')
sheet01.write(0,3,'是否包邮')
sheet01.write(0,4,'是否天猫')
sheet01.write(0,5,'地名')
sheet01.write(0,6,'店名')
sheet01.write(0,7,'url')

for i in range(len(DATA)):
    sheet01.write(i+1,0,DATA[i]['title'])
    sheet01.write(i + 1, 1, DATA[i]['view_price'])
    sheet01.write(i + 1, 2, DATA[i]['view_sales'])
    sheet01.write(i + 1, 3, DATA[i]['view_fee'])
    sheet01.write(i + 1, 4, DATA[i]['isTmall'])
    sheet01.write(i + 1, 5, DATA[i]['area'])
    sheet01.write(i + 1, 6, DATA[i]['name'])
    sheet01.write(i + 1, 7, DATA[i]['detail_url'])

    f.save(u'搜索python的结果.xls')

这里就没有太多方法可言,也就是添加标题,以及存储样式。运行后,我们代码的文件夹中会多一个名为:搜索python的结果.xls 的文件,打开里面就是我们要的结果。然后,整个爬取淘宝信息的流程大致如此。

声明:该博客内容是博主通过视频学习敲写,并未做任何商业用途,做于本人的学习笔记,侵权或触碰到相关法律法规必删,谁叫我是奉公守法的好青年呢。有什么疑问可留言和我交流,谢谢。

猜你喜欢

转载自blog.csdn.net/weixin_39523034/article/details/80152833