利用Python寫(xiě)一個(gè)爬妹子的爬蟲(chóng)
前言
最近學(xué)完P(guān)ython,寫(xiě)了幾個(gè)爬蟲(chóng)練練手,網(wǎng)上的教程有很多,但是有的已經(jīng)不能爬了,主要是網(wǎng)站經(jīng)常改,可是爬蟲(chóng)還是有通用的思路的,即下載數(shù)據(jù)、解析數(shù)據(jù)、保存數(shù)據(jù)。下面一一來(lái)講。
1.下載數(shù)據(jù)
首先打開(kāi)要爬的網(wǎng)站,分析URL,每打開(kāi)一個(gè)網(wǎng)頁(yè)看URL有什么變化,有可能帶上上個(gè)網(wǎng)頁(yè)的某個(gè)數(shù)據(jù),例如xxID之類(lèi),那么我們就需要在上一個(gè)頁(yè)面分析HTML,找到對(duì)應(yīng)的數(shù)據(jù)。如果網(wǎng)頁(yè)源碼找不到,可能是ajax異步加載,去xhr里去找。
有的網(wǎng)站做了反爬的處理,可以添加User-Agent :判斷瀏覽器
self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' # 初始化 headers self.headers = {'User-Agent': self.user_agent}
如果不行,在Chrome上按F12分析請(qǐng)求頭、請(qǐng)求體,看需不需要添加別的信息,例如有的網(wǎng)址添加了referer:記住當(dāng)前網(wǎng)頁(yè)的來(lái)源,那么我們?cè)谡?qǐng)求的時(shí)候就可以帶上。按Ctrl + Shift + C,可以定位元素在HTML上的位置
動(dòng)態(tài)網(wǎng)頁(yè)
有一些網(wǎng)頁(yè)是動(dòng)態(tài)網(wǎng)頁(yè),我們得到網(wǎng)頁(yè)的時(shí)候,數(shù)據(jù)還沒(méi)請(qǐng)求到呢,當(dāng)然什么都提取不出來(lái),用Python 解決這個(gè)問(wèn)題只有兩種途徑:直接從JavaScript 代碼里采集內(nèi)容,或者用Python 的第三方庫(kù)運(yùn)行JavaScript,直接采集你在瀏覽器里看到的頁(yè)面。
1.找請(qǐng)求,看返回的內(nèi)容,網(wǎng)頁(yè)的內(nèi)容可能就在這里。然后可以復(fù)制請(qǐng)求,復(fù)雜的網(wǎng)址中,有些亂七八糟的可以刪除,有意義的部分保留。切記刪除一小部分后先嘗試能不能打開(kāi)網(wǎng)頁(yè),如果成功再刪減,直到不能刪減。
2.Selenium:是一個(gè)強(qiáng)大的網(wǎng)絡(luò)數(shù)據(jù)采集工具(但是速度慢),其最初是為網(wǎng)站自動(dòng)化測(cè)試而開(kāi)發(fā)的。近幾年,它還被廣泛用于獲取精確的網(wǎng)站快照,因?yàn)樗鼈兛梢灾苯舆\(yùn)行在瀏覽器上。Selenium 庫(kù)是一個(gè)在WebDriver 上調(diào)用的API。
WebDriver 有點(diǎn)兒像可以加載網(wǎng)站的瀏覽器,但是它也可以像BeautifulSoup對(duì)象一樣用來(lái)查找頁(yè)面元素,與頁(yè)面上的元素進(jìn)行交互(發(fā)送文本、點(diǎn)擊等),以及執(zhí)行其他動(dòng)作來(lái)運(yùn)行網(wǎng)絡(luò)爬蟲(chóng)。
PhantomJS:是一個(gè)“無(wú)頭”(headless)瀏覽器。它會(huì)把網(wǎng)站加載到內(nèi)存并執(zhí)行頁(yè)面上的JavaScript,但是它不會(huì)向用戶(hù)展示網(wǎng)頁(yè)的圖形界面。把Selenium和PhantomJS 結(jié)合在一起,就可以運(yùn)行一個(gè)非常強(qiáng)大的網(wǎng)絡(luò)爬蟲(chóng)了,可以處理cookie、JavaScript、header,以及任何你需要做的事情。
下載數(shù)據(jù)的模塊有urllib、urllib2及Requests
Requests相比其他倆個(gè)的話(huà),支持HTTP連接保持和連接池,支持使用cookie保持會(huì)話(huà),支持文件上傳,支持自 動(dòng)確定響應(yīng)內(nèi)容的編碼,支持國(guó)際化的 URL 和 POST 數(shù)據(jù)自動(dòng)編碼,而且api相對(duì)來(lái)說(shuō)也簡(jiǎn)單,但是requests直接使用不能異步調(diào)用,速度慢。
html = requests.get(url, headers=headers) #沒(méi)錯(cuò),就是這么簡(jiǎn)單
urllib2以我爬取淘寶的妹子例子來(lái)說(shuō)明:
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = {'User-Agent': user_agent} # 注意:form data請(qǐng)求參數(shù) params = 'q&viewFlag=A&sortType=default&searchStyle=&searchRegion=city%3A&searchFansNum=¤tPage=1&pageSize=100' def getHome(): url = 'https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8' req = urllib2.Request(url, headers=headers) # decode('utf - 8')解碼 把其他編碼轉(zhuǎn)換成unicode編碼 # encode('gbk') 編碼 把unicode編碼轉(zhuǎn)換成其他編碼 # ”gbk”.decode('gbk').encode('utf - 8') # unicode = 中文 # gbk = 英文 # utf - 8 = 日文 # 英文一 > 中文一 > 日文,unicode相當(dāng)于轉(zhuǎn)化器 html = urllib2.urlopen(req, data=params).read().decode('gbk').encode('utf-8') # json轉(zhuǎn)對(duì)象 peoples = json.loads(html) for i in peoples['data']['searchDOList']: #去下一個(gè)頁(yè)面獲取數(shù)據(jù) getUseInfo(i['userId'], i['realName'])
2.解析數(shù)據(jù)
解析數(shù)據(jù)也有很多方式,我只看了beautifulsoup和正則,這個(gè)例子是用正則來(lái)解析的
def getUseInfo(userId, realName): url = 'https://mm.taobao.com/self/aiShow.htm?userId=' + str(userId) req = urllib2.Request(url) html = urllib2.urlopen(req).read().decode('gbk').encode('utf-8') pattern = re.compile('<img.*?src=(.*?)/>', re.S) items = re.findall(pattern, html) x = 0 for item in items: if re.match(r'.*(.jpg")$', item.strip()): tt = 'http:' + re.split('"', item.strip())[1] down_image(tt, x, realName) x = x + 1 print('下載完畢')
正則表達(dá)式說(shuō)明
match:匹配string 開(kāi)頭,成功返回Match object, 失敗返回None,只匹配一個(gè)。
search:在string中進(jìn)行搜索,成功返回Match object, 失敗返回None, 只匹配一個(gè)。
findall:在string中查找所有 匹配成功的組, 即用括號(hào)括起來(lái)的部分。返回list對(duì)象,每個(gè)list item是由每個(gè)匹配的所有組組成的list。
1).*? 是一個(gè)固定的搭配,.和*代表可以匹配任意無(wú)限多個(gè)字符,加上?表示使用非貪婪模式進(jìn)行匹配,也就是我們會(huì)盡可能短地做匹配
2)(.*?)代表一個(gè)分組,如果有5個(gè)(.*?)就說(shuō)明匹配了五個(gè)分組
3) 正則表達(dá)式中,“.”的作用是匹配除“\n”以外的任何字符,也就是說(shuō),它是在一行中進(jìn)行匹配。這里的“行”是以“\n”進(jìn)行區(qū)分的。HTML標(biāo)簽每行的末尾有一個(gè)“\n”,不過(guò)它不可見(jiàn)。 如果不使用re.S參數(shù),則只在每一行內(nèi)進(jìn)行匹配,如果一行沒(méi)有,就換下一行重新開(kāi)始,不會(huì)跨行。而使用re.S參數(shù)以后,正則表達(dá)式會(huì)將這個(gè)字符串作為一個(gè)整體,將“\n”當(dāng)做一個(gè)普通的字符加入到這個(gè)字符串中,在整體中進(jìn)行匹配。
3.保存數(shù)據(jù)
數(shù)據(jù)解析后可以保存到文件或數(shù)據(jù)庫(kù)中,這個(gè)例子是保存到了文件中,很簡(jiǎn)單,就不做說(shuō)明了,在下篇講如何將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)
http://www.dbjr.com.cn/article/141674.htm
def down_image(url, filename, realName): req = urllib2.Request(url=url) folder = 'e:\\images\\%s' % realName if os.path.isdir(folder): pass else: os.makedirs(folder) f = folder + '\\%s.jpg' % filename if not os.path.isfile(f): print f binary_data = urllib2.urlopen(req).read() with open(f, 'wb') as temp_file: temp_file.write(binary_data)
GitHub地址,還有其他網(wǎng)站爬蟲(chóng),歡迎star:https://github.com/peiniwan/CreeperTest (本地下載)
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- python妹子圖簡(jiǎn)單爬蟲(chóng)實(shí)例
- python實(shí)現(xiàn)爬蟲(chóng)下載美女圖片
- python爬蟲(chóng)入門(mén)教程之點(diǎn)點(diǎn)美女圖片爬蟲(chóng)代碼分享
- Python制作爬蟲(chóng)抓取美女圖
- python制作花瓣網(wǎng)美女圖片爬蟲(chóng)
- 零基礎(chǔ)寫(xiě)python爬蟲(chóng)之爬蟲(chóng)編寫(xiě)全記錄
- Python爬蟲(chóng)框架Scrapy安裝使用步驟
- Python爬蟲(chóng)模擬登錄帶驗(yàn)證碼網(wǎng)站
- 使用Python編寫(xiě)簡(jiǎn)單網(wǎng)絡(luò)爬蟲(chóng)抓取視頻下載資源
- python抓取網(wǎng)頁(yè)圖片示例(python爬蟲(chóng))
相關(guān)文章
Python基于opencv調(diào)用攝像頭獲取個(gè)人圖片的實(shí)現(xiàn)方法
今天小編就為大家分享一篇關(guān)于Python基于opencv調(diào)用攝像頭獲取個(gè)人圖片的實(shí)現(xiàn)方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02Python實(shí)現(xiàn)批量修改指定目錄下圖片的大小
批量修改指定目錄下圖片大小通常是在需要對(duì)大量圖片進(jìn)行統(tǒng)一處理的情況下使用的,本文主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)批量修改圖片大小,需要的可以參考下2023-10-10詳解python實(shí)現(xiàn)小波變換的一個(gè)簡(jiǎn)單例子
這篇文章主要介紹了詳解python實(shí)現(xiàn)小波變換的一個(gè)簡(jiǎn)單例子,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07pytorch動(dòng)態(tài)神經(jīng)網(wǎng)絡(luò)(擬合)實(shí)現(xiàn)
這篇文章主要介紹了pytorch動(dòng)態(tài)神經(jīng)網(wǎng)絡(luò)(擬合)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03python目標(biāo)檢測(cè)基于opencv實(shí)現(xiàn)目標(biāo)追蹤示例
這篇文章主要為大家介紹了python基于opencv實(shí)現(xiàn)目標(biāo)追蹤示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05python3的數(shù)據(jù)類(lèi)型及數(shù)據(jù)類(lèi)型轉(zhuǎn)換實(shí)例詳解
在本文里小編給大家分享的是關(guān)于python3的數(shù)據(jù)類(lèi)型及數(shù)據(jù)類(lèi)型轉(zhuǎn)換以及相關(guān)實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2019-08-08Python(TensorFlow框架)實(shí)現(xiàn)手寫(xiě)數(shù)字識(shí)別系統(tǒng)的方法
這篇文章主要介紹了Python(TensorFlow框架)實(shí)現(xiàn)手寫(xiě)數(shù)字識(shí)別系統(tǒng)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Python PyQt4實(shí)現(xiàn)QQ抽屜效果
這篇文章主要為大家詳細(xì)介紹了Python PyQt4實(shí)現(xiàn)QQ抽屜效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04