本篇文章為大家展示了python中怎么利用requests爬取百度貼吧用戶信息,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、港南網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為港南等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
1.安裝需要的工具包:
requests包,這個(gè)主要是用來發(fā)送get或者post請求,獲取請求結(jié)果
pip install requests
beautifulSoup包,這個(gè)主要是用來解析得到的html頁面的,方便簡單,但是這個(gè)包效率低
除了這個(gè)包,還可以去嘗試用xpath,css選擇器,甚至正則去解析,只要你喜歡,用什么解析都可以,本次使用beautifulSoup包
pip install bs4
pymongo,這個(gè)python操作MongoDB的工具包,在爬蟲中,因?yàn)榕老聛淼臄?shù)據(jù)有一部分是臟數(shù)據(jù),所以比較適合使用非關(guān)系型數(shù)據(jù)庫存儲(chǔ),mongodb就是一個(gè)非關(guān)系數(shù)據(jù)庫
pip install pymongo
因?yàn)槲沂褂玫氖且豢钤茢?shù)據(jù)庫所以需要安裝一下DNSpython,如果不是用mongodb官網(wǎng)提供的云數(shù)據(jù)庫,不需要安裝這個(gè)
pip install dnspython
2.分析頁面
首先進(jìn)入python吧
此時(shí)頁面鏈接是http://tieba.baidu.com/f?ie=utf-8&kw=python&fr=search&red_tag=s3038027151
我們點(diǎn)擊下一頁,多點(diǎn)擊幾次,然后上一頁,回到首頁
發(fā)現(xiàn)鏈接http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=0,http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=0
在多個(gè)鏈接中,我們發(fā)現(xiàn)規(guī)律kw是搜索的關(guān)鍵字,pn是分頁,第一頁是0,第二頁是50,第三頁是100,此時(shí)我們根據(jù)這種規(guī)律拼接出來url鏈接,放到postman中請求,發(fā)現(xiàn)規(guī)律是對的。這樣我們就可以發(fā)送請求去抓取列表頁了。
現(xiàn)在我們抓取到列表頁了,那么怎么獲取用戶信息呢。
這時(shí)我發(fā)現(xiàn)鼠標(biāo)放到此處時(shí)會(huì)彈出用戶的相關(guān)信息,所以此處應(yīng)該可能會(huì)有一個(gè)請求用戶信息的接口
現(xiàn)在我們打開開發(fā)者工具,重新把鼠標(biāo)放到此處時(shí),
果然發(fā)現(xiàn)了請求,結(jié)果為json數(shù)據(jù),然后將結(jié)果復(fù)制到j(luò)son在線這個(gè)網(wǎng)站解析,然后發(fā)現(xiàn)正是我們想要的數(shù)據(jù),(這里就不貼數(shù)據(jù)了)
此時(shí)我們分享這個(gè)請求http://tieba.baidu.com/home/get/panel?ie=utf-8&un=du_%E5%B0%8F%E9%99%8C
在請求多人后,發(fā)現(xiàn)是根據(jù)un這個(gè)參數(shù)去區(qū)分不同的人的,在下圖中列出了un這個(gè)參數(shù),根據(jù)經(jīng)驗(yàn)可知,這個(gè)應(yīng)該用戶的注冊用戶名,
那么我們從哪里獲取這個(gè)字段呢,
既然它根據(jù)這個(gè)字段請求了后端接口,那么頁面上肯定有這個(gè)字段,這時(shí)候我們打開開發(fā)者工具,查看源代碼,在頁面定位到這個(gè)元素,然后我們發(fā)現(xiàn)
un字段就在這里,那么我們就可以用這個(gè)字段去拼接url了,通過測試后,發(fā)現(xiàn)正確
3.代碼
爬蟲分析完了,這時(shí)候就要開始寫代碼了
首先請求頁面,
發(fā)送請求,然后parseList()
def tiebaSpider(self,key,beginPage,endPage): #配置url請求鏈接和請求頭 beginPage = (beginPage - 0) * 50 endPage = (endPage+1) * 50 headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"} for page in range(beginPage,endPage,50): url="http://tieba.baidu.com/f?kw=%s&ie=utf-8&pn=%s"%(key,page) #發(fā)送get請求 response=requests.get(url,headers=headers) self.parseList(response.text)
解析貼吧頁面:
利用beautifulSoup解析頁面,
find()函數(shù)查找一條符合的數(shù)據(jù),第一個(gè)參數(shù)為html的標(biāo)簽; 如果根據(jù)id找,則使用id參數(shù)
find_all()查找所有符合的數(shù)據(jù),如果根據(jù)class去找,則使用class_參數(shù),
如果直接根據(jù)標(biāo)簽去找,則不需要id或者class_參數(shù),下面的方法都有用到
在解析中,我先找到了a標(biāo)簽,然后提取其的href數(shù)據(jù),提取方式為a['href']
獲取屬性值后進(jìn)行切割,切割的是?un=之后和第一個(gè)&之前的數(shù)據(jù),
如果這個(gè)數(shù)據(jù)不為空,則發(fā)送請求獲取用戶信息
def parseList(self,response): #解析列表頁,創(chuàng)建bs4 soup =BeautifulSoup(response,'html.parser') #根據(jù)頁面解析獲取ul標(biāo)簽 ul=soup.find("ul",id='thread_list')#獲取下面的li標(biāo)簽 liList=ul.find_all('span',class_='frs-author-name-wrap') #解析獲取需要的數(shù)據(jù) for li in liList: a=li.find('a') un=a['href'].split('&')[0].split('?un=')[-1] if un!='' and un !=None: #拼接請求了解,獲取用戶信息 response=requests.get("http://tieba.baidu.com/home/get/panel?ie=utf-8&un="+un) print("http://tieba.baidu.com/home/get/panel?ie=utf-8&un="+un) print(response.url) self.parseDetail(response.text)
解析用戶信息
因?yàn)檫@個(gè)是json數(shù)據(jù),所以直接用json包去解析即可,然后存入mongodb中
#解析用戶信息 def parseDetail(self,response): try: info=json.loads(response) #利用json的loads方法將json字符串轉(zhuǎn)換成字典類型取值 data=info['data'] result = {} result['name']=data['name'] result['name_show']=data['name_show'] sex=data['sex'] if sex=='female': result['sex']='女' elif sex=='male': result['sex']='男' else: result['sex']='未知' result['tb_age']=data['tb_age'] result['id']=data['id'] result['post_num']=data['post_num'] result['tb_vip']=data['tb_vip'] result['followed_count']=data['followed_count'] self.collection.insert_one(result) except: pass
4.總結(jié)
到此整個(gè)項(xiàng)目做完了
但是依然有一些改進(jìn)之處,我將思路和想法寫下來,大家學(xué)習(xí)的時(shí)候,可以自己去嘗試一下,
1.沒有去做去重,這樣會(huì)導(dǎo)致大量的重復(fù)數(shù)據(jù)
解決思路:可以將請求用戶信息的了解進(jìn)行保存,然后再次請求時(shí),先去驗(yàn)證有沒有請求過
2。反扒,在請求第二個(gè)鏈接時(shí),會(huì)出現(xiàn)重定向,經(jīng)過postman請求發(fā)現(xiàn),不是鏈接的問題,那只能是頻繁請求被封,
上述內(nèi)容就是python中怎么利用requests爬取百度貼吧用戶信息,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。