爬蟲數據存儲到不同表格
㈠ 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」公眾號,獲取更多有價值的內容與交流。