爬虫数据存储到不同表格
㈠ python爬取淘宝商品信息并生成Excel
1前言后台有很多小伙伴私信问我关于python爬虫的知识和学习资源,今天这篇文章就简单介绍下python爬虫的知识点,并以爬取淘宝网的商品信息存到excel表格中进行演示,同样的本文的源码会同步至github,欢迎下载使用。
2爬虫相关知识在进行爬虫之前,需要先了解一些关于爬虫的基本知识。
首先我们需要先了解下爬虫的基本原理:
基本的网页请求的过程都可以分为以下两个步骤:
1、Request(请求):每一个展示在用户面前的网页都必须经过这一步,也就是向服务器发送访问请求。
2、Response(响应):服务器在接收到用户的请求后,会验证请求的有效性,然后向用户(客户端)发送响应的内容,客户端接收服务器响应的内容,将内容展示出来(即网页),如下图所示。
网页请求的方式也分为两种:
1、GET:最常见的方式,一般用于获取或者查询资源信息,也是大多数网站使用的方式,响应速度快。
2、POST:相比GET方式,多了以表单形式上传参数的功能,因此除查询信息外,还可以修改信息。
所以,在写爬虫前我们要先确定向谁发送请求,并且用什么方式发送。
向谁发送请求,那我们就需要了解请求的url地址,以淘宝网的眼镜的url为例:
https://s.taobao.com/search?q=%E7%9C%BC%E9%95%9C&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这里眼镜中文被转义了:
这里我们只需要知道q后面的值就是我们搜索的商品的名字就可以了,后面其他的参数这里暂时对我们没用。
因为爬虫并不只爬取一页的信息,我们跳转到下一页:
可以发现s的值=44*(页码-1)。
接着ctrl+U组合键打开源码,可以发现有一个g_page_config的json串,里面的data值如下:
,"data":{"postFeeText":"运费","trace":"msrp_auction","auctions":[{"p4p":1,"p4pSameHeight":true,"nid":"536766094512","category":"","pid":"","title":"近视u003cspanclassu003dHu003e眼镜u003c/spanu003e男有度数超轻全框u003cspanclassu003dHu003e眼镜u003c/spanu003e框半框舒适可配u003cspanclassu003dHu003e眼镜u003c/spanu003e防雾眼睛近视镜","raw_title":"丹阳眼镜眼镜框眼镜架眼睛框防辐射光学镜","pic_url":"//g-search1.alicdn.com/img/bao/uploaded/i4/imgextra/i2/104870285060645671/TB2ulgla4vzQeBjSZPfXXbWGFXa_!!0-saturn_solar.jpg"这里postFeeText即为运费,raw_title为标题,pic_url即为展示图片的地址,
view_price:运费;
nick:商铺的名称;
item_loc:地址;
view_sales:销售量。
以上的数据即对应下面的这些信息:
请求方式可以F12,然后再network--->headers--->requestMethod找到:
在了解上面的基本内容之后我们就可以写一个小型的爬虫了,比如下面的代码:
#导入requests包importrequestsurl='https://s.taobao.com/search?q=%E7%9C%BC%E9%95%9C&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=3&p4ppushleft=1%2C48&s=44'#Get方式获取网页数据strhtml=requests.get(url)print(strhtml.text)这样就将页面的内容获取并以html的格式展示出来了。
使用requests库请求网站加载库使用的语句是import+库的名字。在上述过程中,加载requests库的语句是:importrequests。
用GET方式获取数据需要调用requests库中的get方法,使用方法是在requests后输入英文点号,如下所示:
requests.get将获取到的数据存到strhtml变量中,代码如下:
strhtml=request.get(url)这个时候strhtml是一个URL对象,它代表整个网页,但此时只需要网页中的源码,下面的语句表示网页源码:
strhtml.text3实战接下来我们完整的爬取淘宝的信息,主要爬取的信息是:商品名称、店铺名称、价格、地区、付款人数。
首先我们定义一个函数获取请求的url:
#前面介绍q即为查询的商品的名称,所以这里定义为变量,方便后面重复使用defGeturls(q,x):url="https://s.taobao.com/search?q="+q+"&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"urls=[]urls.append(url)ifx==1:returnurlsforiinrange(1,x):url="https://s.taobao.com/search?q="+q+"&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=3&p4ppushleft=1%2C48&s="+str(i*44)urls.append(url)returnurls然后定义一个函数来获取html的页面:
defGetHtml(url):#这里的请求get请求r=requests.get(url,headers=headers)r.raise_for_status()r.encoding=r.apparent_encodingreturnr然后定义一个函数获取商品的信息并插入excel:
首先介绍一个re库:
re库是python的标准库
re库采用rawstring类型表示正则表达式,表示为:r'test'
原生字符串(rawstring)是不包含转义符的字符串。
Re库主要功能函数如下:
这里我们使用findall()函数提取信息,比如:
a=re.findall(r'"raw_title":"(.*?)"',html)defGetandintoExcel(html):globalcount#商品名称a=re.findall(r'"raw_title":"(.*?)"',html)#店铺名称b=re.findall(r'"nick":"(.*?)"',html)#商品价格c=re.findall(r'"view_price":"(.*?)"',html)#地区d=re.findall(r'"item_loc":"(.*?)"',html)#销售量e=re.findall(r'"view_sales":"(.*?)"',html)x=[]foriinrange(len(a)):try:x.append((a[i],b[i],c[i],d[i],e[i]))exceptIndexError:breaki=0foriinrange(len(x)):worksheet.write(count+i+1,0,x[i][0])worksheet.write(count+i+1,1,x[i][1])worksheet.write(count+i+1,2,x[i][2])worksheet.write(count+i+1,3,x[i][3])worksheet.write(count+i+1,4,x[i][4])count=count+len(x)returnprint("数据爬取完成")主函数如下:
,"data":{"postFeeText":"运费","trace":"msrp_auction","auctions":[{"p4p":1,"p4pSameHeight":true,"nid":"536766094512","category":"","pid":"","title":"近视u003cspanclassu003dHu003e眼镜u003c/spanu003e男有度数超轻全框u003cspanclassu003dHu003e眼镜u003c/spanu003e框半框舒适可配u003cspanclassu003dHu003e眼镜u003c/spanu003e防雾眼睛近视镜","raw_title":"丹阳眼镜眼镜框眼镜架眼睛框防辐射光学镜","pic_url":"//g-search1.alicdn.com/img/bao/uploaded/i4/imgextra/i2/104870285060645671/TB2ulgla4vzQeBjSZPfXXbWGFXa_!!0-saturn_solar.jpg"0最后运行程序:
以上就是如何使用python爬取淘宝信息的内容,全部代码如下:
(q,x):url="https://s.taobao.com/search?q="+q+"&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"urls=[]urls.append(url)ifx==1:returnurlsforiinrange(1,x):url="https://s.taobao.com/search?q="+q+"&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=3&p4ppushleft=1%2C48&s="+str(i*44)urls.append(url)returnurlsdefGetHtml(url):r=requests.get(url,headers=headers)r.raise_for_status()r.encoding=r.apparent_(html):globalcounta=re.findall(r'"raw_title":"(.*?)"',html)b=re.findall(r'"nick":"(.*?)"',html)c=re.findall(r'"view_price":"(.*?)"',html)d=re.findall(r'"item_loc":"(.*?)"',html)e=re.findall(r'"view_sales":"(.*?)"',html)x=[]foriinrange(len(a)):try:x.append((a[i],b[i],c[i],d[i],e[i]))exceptIndexError:breaki=0foriinrange(len(x)):worksheet.write(count+i+1,0,x[i][0])worksheet.write(count+i+1,1,x[i][1])worksheet.write(count+i+1,2,x[i][2])worksheet.write(count+i+1,3,x[i][3])worksheet.write(count+i+1,4,x[i][4])count=count+len(x)returnprint("数据爬取完成")if__name__=="__main__":count=0headers={"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/80.0.3987.149Safari/537.36","cookie":"t=;sgcookie=E100VfIm5WNNIHQbxK40GoWlA%2BiEh8%%3D%3D;tracknick=%5Cu5C0F%5Cu5C0F%5Cu5C0F%5Cu5C0F%5Cu54466;_cc_=UtASsssmfA%3D%3D;thw=cn;enc=l%%2F4%2FN%2FROmEcqBpM4Uk%2FlCcbvHxEX4HhA%3D%3D;cna=E7gdGOrz1lwCAXOs+dCyLVoL;_m_h5_tk=_1606566002810;_m_h5_tk_enc=;cookie2=;v=0;_tb_token_=0a7840e5536b;JSESSIONID=;alitrackid=www.taobao.com;lastalitrackid=www.taobao.com;hng=CN%7Czh-CN%7CCNY%7C156;xlly_s=1;_samesite_flag_=true;tfstk=-7AiGgoy0ZkfSPvIBC..;l=eBjdYUdPOiL-v4n5U62j-la_kmn;isg=BE5OFMfVnXt4DynJaP_rUvlZnyQQzxLJN80UA3iXutEM2-414F9i2fSZEwe3Qwrh"}q=input("你想爬取的商品是:")x=int(input("你想爬取几页数据:"))urls=Geturls(q,x)workbook=xlsxwriter.Workbook(q+".xlsx")worksheet=workbook.add_worksheet()worksheet.set_column('A:A',70)worksheet.set_column('B:B',40)worksheet.set_column('C:C',20)worksheet.set_column('D:D',20)worksheet.set_column('E:E',20)worksheet.write('A1','商品名称')worksheet.write('B1','店铺名称')worksheet.write('C1','价格')worksheet.write('D1','地区')worksheet.write('E1','付款人数')xx=[]forurlinurls:html=GetHtml(url)s=GetandintoExcel(html.text)time.sleep(5)workbook.close()4再说一句:反爬虫最后说一下爬虫的合法性。几乎每一个网站都有一个名为robots.txt的文档,当然也有部分网站没有设定robots.txt。对于没有设定robots.txt的网站可以通过网络爬虫获取没有口令加密的数据,也就是该网站所有页面数据都可以爬取。如果网站有robots.txt文档,就要判断是否有禁止访客获取的数据。以网络为例,在浏览器中访问https://www..com/robots.txt。
可以看到网络可以允许部分爬虫访问它的部分路径,而对于没有得到允许的用户,则全部禁止爬取的,代码如下:
,"data":{"postFeeText":"运费","trace":"msrp_auction","auctions":[{"p4p":1,"p4pSameHeight":true,"nid":"536766094512","category":"","pid":"","title":"近视u003cspanclassu003dHu003e眼镜u003c/spanu003e男有度数超轻全框u003cspanclassu003dHu003e眼镜u003c/spanu003e框半框舒适可配u003cspanclassu003dHu003e眼镜u003c/spanu003e防雾眼睛近视镜","raw_title":"丹阳眼镜眼镜框眼镜架眼睛框防辐射光学镜","pic_url":"//g-search1.alicdn.com/img/bao/uploaded/i4/imgextra/i2/104870285060645671/TB2ulgla4vzQeBjSZPfXXbWGFXa_!!0㈡ python爬取和分析新浪微博(一):scrapy构建新浪微博榜单、博主及微博信息爬虫
爬虫项目介绍
本项目基于Python的Scrapy框架,采用随机用户代理和IP代理等反爬技巧,将收集到的微博领域数据、各领域榜单博主信息和博主的微博信息分别存入MySQL数据库的相应表格。
查看完整代码请访问GitHub:
爬虫逻辑
2.1 获取微博领域信息
首先,爬取V影响力榜上所有微博领域名称及其对应的各领域微博榜单链接。
2.2 获取各领域榜单博主信息
进入各领域排行榜页面(如互联网榜),抓取4月月榜排名前100的博主信息。
分析网页得知,博主信息通过单独请求json文件获取。
请求的URL地址为:v6.bang.weibo.com/aj/we...
URL中__rnd字段的值由请求时间戳生成。
使用POST请求,并在表单中包含type、date、domainId等字段。
编写请求代码如下:
2.3 获得博主个人主页和发表微博信息
收集每个博主的昵称、ID、粉丝数、关注数、微博数、性别、地址等信息后,进入博主的微博主页,抓取最近60条微博信息(包括内容、发表日期、转发/点赞/评论数等)。
请求博主主页URL时需携带固定的cookie信息。
博主微博主页分析发现,发表的微博内容通过单独请求json文件获取。
json文件的URL很长,包含domain、pl_name、page_id、script_uri等字段。
请求方式为GET。
请求json文件后,将data值转化为Scrapy的Selector子类,使用CSS或XPath选择器获取所需信息。
爬虫代理设置
为了对抗微博的反爬策略,本项目使用随机更换User-Agent和IP地址的方法。
3.1 随机User-Agent
编写RandomUserAgentMiddleware中间件,使用fake-useragent生成UserAgent实例,为每次请求随机生成一个User-Agent。
具体代码在GitHub上。
3.2 随机IP
从蘑菇IP代理购买付费IP,生成API链接,处理返回的JSON文件提取IP信息,保存至MySQL数据库。Scrapy每次请求时从数据库随机获取一个有效IP。
通过变换IP地址发送请求,基本避免了被反爬。
爬取结果
异步保存至MySQL数据库,数据分别存入weibotopic、topicuser、weiboinfo三个表格。
weibotopic(38个领域):
topicuser(3648个用户,有些领域榜单上可能不足100个用户):
weiboinfo(115740条微博)
小结
以上介绍了基于V影响力榜单爬取新浪微博信息的爬虫项目,代码在GitHub上公开,欢迎查看、交流。
后续文章将对收集到的数据进行统计分析和可视化展示,期待进一步的探索。
㈢ Python实战:爬取小红书
本文提供一种方法,利用Python爬取小红书平台,针对特定关键词搜索相关笔记,并将结果以excel表格形式保存。所爬取的字段包括笔记标题、作者、笔记链接、作者主页地址、作者头像以及点赞量。实验结果显示,每次运行爬虫都能顺利爬取数据,每次平均约200条笔记。遇到的技术难题在实验过程中得到解决,使得该爬虫具有较高的实用性。以下为使用不同关键词搜索的示例结果。
以关键词“繁花”为例,搜索后将数据保存至本地excel文件,打开查看发现笔记根据点赞量由高到低排列。
对于关键词“上海旅游”,搜索并保存至excel,打开查看发现同样按照点赞量排序的笔记列表。
使用关键词“春节”,搜索后保存至excel文件,同样按照点赞量排序展示笔记。
本方法采用纯模拟人操作的策略,避免触碰小红书的反爬机制,通过如下步骤实现爬取:打开小红书主页、登录账号、关键词搜索、提取页面数据、循环刷新页面、数据处理去重排序、保存至excel文件。此方法确保了数据的可靠性和爬取过程的顺利进行。
具体实现分为多个步骤,包括使用DrissionPage库打开小红书主页、登录账号、设置关键词、搜索结果处理、滑动页面获取数据、保存数据至excel文件等。此外,还包含细节优化,如自动调整excel表格列宽、处理数据类型转换、删除重复数据等。
为了帮助读者更好地理解代码逻辑,本文附带了爬取过程的视频录屏,以及主函数代码示例。最后,本文提供了一种以付费形式获取代码的方法,鼓励对数据有价值的需求进行付费支持。欢迎关注“程序员coding”公众号,获取更多有价值的内容与交流。