urllib.request.Request('URL',headers = headers)
User-Agent 是爬蟲(chóng)和反爬蟲(chóng)斗爭(zhēng)的第一步,發(fā)送請(qǐng)求必須帶User—Agent
使用流程:
??? 1、創(chuàng)建請(qǐng)求對(duì)象
??????? request = urlllib.request.Request('url'......)
??? 2、發(fā)送請(qǐng)求獲取響應(yīng)對(duì)象
??????? response = urllib.request.urlopen(request)
??? 3、獲取響應(yīng)內(nèi)容
??????? html = response.read().deconde('utf-8')
為什么要使用User—Agent呢?如果沒(méi)有這個(gè)就對(duì)網(wǎng)頁(yè)進(jìn)行爬取,當(dāng)爬取大量數(shù)據(jù)短時(shí)間大量訪問(wèn)網(wǎng)頁(yè)那邊就會(huì)知道你這邊是一個(gè)程序,就可以進(jìn)行屏蔽,使用User-Agent能夠讓那邊認(rèn)為你這邊的爬蟲(chóng)是一個(gè)瀏覽器對(duì)其進(jìn)行訪問(wèn),不會(huì)攔截,當(dāng)然如果就一個(gè)User-Agent短時(shí)間訪問(wèn)多次也是會(huì)被攔截,此時(shí)解決問(wèn)題的方法是使用多個(gè)User-Agent,每次訪問(wèn)網(wǎng)頁(yè)都隨機(jī)選取一個(gè)User-Agent,這樣就可以解決該問(wèn)題。
簡(jiǎn)單的示例,使用上面的方法爬取百度首頁(yè)內(nèi)容:
import urllib.request url = " https://www.baidu.com/ " headers = { ' User-Agent ' : ' 自己找一個(gè)Uer-Agent ' } # 1、創(chuàng)建請(qǐng)求對(duì)象 req = urllib.request.Request(url, headers= headers) # 2、獲取響應(yīng)對(duì)象 res = urllib.request.urlopen(req) # 3|響應(yīng)對(duì)象read().decode('utf-8') html = res.read().decode( ' utf-8 ' ) print (html)
如果要爬取一些復(fù)雜的網(wǎng)頁(yè),就需要對(duì)網(wǎng)頁(yè)進(jìn)行分析。
比如說(shuō)對(duì)騰訊招聘進(jìn)行爬取,首先騰訊招聘網(wǎng)頁(yè)是一個(gè)動(dòng)態(tài)網(wǎng)頁(yè),簡(jiǎn)單方式爬取不了,那我們找到這個(gè)網(wǎng)頁(yè)的json網(wǎng)頁(yè)如下:
https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1563246818490&countryId=&cityId=&bgIds=&productId=&categoryId=40001001,40001002,40001003,40001004,40001005,40001006&parentCategoryId=&attrId=&keyword=&
pageIndex=0
&pageSize=10&language=zh-cn&area=cn
網(wǎng)頁(yè)獲得的結(jié)果是這樣的:
這樣看起來(lái)很難受,所以用一個(gè)插件JSON View(chrome瀏覽器),重新加載后格式為:
這樣看起來(lái)就舒服多了,而且都是字典格式以及列表,找到我們想要的數(shù)據(jù)就更加簡(jiǎn)單了。
我們可以修改pageIndex這個(gè)錨點(diǎn)的值跳轉(zhuǎn)到不同頁(yè)面,對(duì)多個(gè)頁(yè)面進(jìn)行爬取。
話不多說(shuō),直接先上代碼:
import urllib.request import json beginURL = ' https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1563246818490&countryId=&cityId=&bgIds=&productId=&categoryId=40001001,40001002,40001003,40001004,40001005,40001006&parentCategoryId=&attrId=&keyword=&pageIndex= ' offset = 0 endURL = ' &pageSize=10&language=zh-cn&area=cn ' start_urls = beginURL + str(offset) + endURL headers = { ' User-Agent ' : ' 自己找一個(gè)User-Agent ' } while True: if offset < 2 : offset += 1 else : break html = urllib.request.urlopen(start_urls, headers= headers) result = json.loads(html.read()) position = {} L = [] for i in range(len(result[ ' Data ' ][ ' Posts ' ])): position[ ' 職位名稱 ' ] = result[ ' Data ' ][ ' Posts ' ][i][ ' RecruitPostName ' ] position[ ' 最近公布時(shí)間 ' ] = result[ ' Data ' ][ ' Posts ' ][i][ ' LastUpdateTime ' ] position[ ' 工作地點(diǎn) ' ] = result[ ' Data ' ][ ' Posts ' ][i][ ' CountryName ' ] + result[ ' Data ' ][ ' Posts ' ][0][ ' LocationName ' ] position[ ' 職位內(nèi)容 ' ] = result[ ' Data ' ][ ' Posts ' ][i][ ' Responsibility ' ] position[ ' 工作鏈接 ' ] = result[ ' Data ' ][ ' Posts ' ][i][ ' PostURL ' ] L.append(position) print (L) with open( ' TencentJobs.json ' , ' a ' , encoding= ' utf-8 ' ) as fp: json.dump(L, fp, ensure_ascii =False)
我的思路大致是這樣的:
首先從一個(gè)網(wǎng)頁(yè)里面爬取到自己想要的數(shù)據(jù),將第一個(gè)網(wǎng)頁(yè)加載出來(lái),
html = urllib.request.urlopen(start_urls, headers=
headers)? result =
json.loads(html.read()),將start-urls換成第一個(gè)網(wǎng)頁(yè)的url就可以了,通過(guò)程序?qū)⒕W(wǎng)頁(yè)得到的結(jié)果放在result里,
然后從第一個(gè)網(wǎng)頁(yè)進(jìn)行分析,發(fā)現(xiàn)它里面的內(nèi)容都是字典還有一個(gè)列表,那么通過(guò)字典和列表的索引方式找到我們想要的數(shù)據(jù)。例如,獲得職位名稱可以使用result[
'
Data
'][
'
Posts
'][i][
'
RecruitPostName
'
],再用一個(gè)一個(gè)position字典進(jìn)行保存,后面依次類推。
將所有的字典都保存到一個(gè)列表L里面,然后再將L內(nèi)數(shù)據(jù)寫(xiě)入到本地json文件中。對(duì)于多頁(yè)面找到了錨點(diǎn)pageIndex,就通過(guò)一些手段每次某一頁(yè)面爬取完就更改pageIndex爬取下一頁(yè)。本程序通過(guò)更改offset的值,原網(wǎng)頁(yè)應(yīng)該有203個(gè)頁(yè)面左右,我程序里面只爬取了兩個(gè)頁(yè)面,可以自行更改。
好了,如果使用了scrapy框架就會(huì)體會(huì)到python爬蟲(chóng)是多么的方便了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
