利用Python寫一個爬妹子的爬蟲
前言
最近學(xué)完P(guān)ython,寫了幾個爬蟲練練手,網(wǎng)上的教程有很多,但是有的已經(jīng)不能爬了,主要是網(wǎng)站經(jīng)常改,可是爬蟲還是有通用的思路的,即下載數(shù)據(jù)、解析數(shù)據(jù)、保存數(shù)據(jù)。下面一一來講。
1.下載數(shù)據(jù)
首先打開要爬的網(wǎng)站,分析URL,每打開一個網(wǎng)頁看URL有什么變化,有可能帶上上個網(wǎng)頁的某個數(shù)據(jù),例如xxID之類,那么我們就需要在上一個頁面分析HTML,找到對應(yīng)的數(shù)據(jù)。如果網(wǎng)頁源碼找不到,可能是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分析請求頭、請求體,看需不需要添加別的信息,例如有的網(wǎng)址添加了referer:記住當前網(wǎng)頁的來源,那么我們在請求的時候就可以帶上。按Ctrl + Shift + C,可以定位元素在HTML上的位置
動態(tài)網(wǎng)頁
有一些網(wǎng)頁是動態(tài)網(wǎng)頁,我們得到網(wǎng)頁的時候,數(shù)據(jù)還沒請求到呢,當然什么都提取不出來,用Python 解決這個問題只有兩種途徑:直接從JavaScript 代碼里采集內(nèi)容,或者用Python 的第三方庫運行JavaScript,直接采集你在瀏覽器里看到的頁面。
1.找請求,看返回的內(nèi)容,網(wǎng)頁的內(nèi)容可能就在這里。然后可以復(fù)制請求,復(fù)雜的網(wǎng)址中,有些亂七八糟的可以刪除,有意義的部分保留。切記刪除一小部分后先嘗試能不能打開網(wǎng)頁,如果成功再刪減,直到不能刪減。
2.Selenium:是一個強大的網(wǎng)絡(luò)數(shù)據(jù)采集工具(但是速度慢),其最初是為網(wǎng)站自動化測試而開發(fā)的。近幾年,它還被廣泛用于獲取精確的網(wǎng)站快照,因為它們可以直接運行在瀏覽器上。Selenium 庫是一個在WebDriver 上調(diào)用的API。
WebDriver 有點兒像可以加載網(wǎng)站的瀏覽器,但是它也可以像BeautifulSoup對象一樣用來查找頁面元素,與頁面上的元素進行交互(發(fā)送文本、點擊等),以及執(zhí)行其他動作來運行網(wǎng)絡(luò)爬蟲。
PhantomJS:是一個“無頭”(headless)瀏覽器。它會把網(wǎng)站加載到內(nèi)存并執(zhí)行頁面上的JavaScript,但是它不會向用戶展示網(wǎng)頁的圖形界面。把Selenium和PhantomJS 結(jié)合在一起,就可以運行一個非常強大的網(wǎng)絡(luò)爬蟲了,可以處理cookie、JavaScript、header,以及任何你需要做的事情。
下載數(shù)據(jù)的模塊有urllib、urllib2及Requests
Requests相比其他倆個的話,支持HTTP連接保持和連接池,支持使用cookie保持會話,支持文件上傳,支持自 動確定響應(yīng)內(nèi)容的編碼,支持國際化的 URL 和 POST 數(shù)據(jù)自動編碼,而且api相對來說也簡單,但是requests直接使用不能異步調(diào)用,速度慢。
html = requests.get(url, headers=headers) #沒錯,就是這么簡單
urllib2以我爬取淘寶的妹子例子來說明:

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
# 注意:form data請求參數(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相當于轉(zhuǎn)化器
html = urllib2.urlopen(req, data=params).read().decode('gbk').encode('utf-8')
# json轉(zhuǎn)對象
peoples = json.loads(html)
for i in peoples['data']['searchDOList']:
#去下一個頁面獲取數(shù)據(jù)
getUseInfo(i['userId'], i['realName'])
2.解析數(shù)據(jù)
解析數(shù)據(jù)也有很多方式,我只看了beautifulsoup和正則,這個例子是用正則來解析的
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('下載完畢')
正則表達式說明
match:匹配string 開頭,成功返回Match object, 失敗返回None,只匹配一個。
search:在string中進行搜索,成功返回Match object, 失敗返回None, 只匹配一個。
findall:在string中查找所有 匹配成功的組, 即用括號括起來的部分。返回list對象,每個list item是由每個匹配的所有組組成的list。
1).*? 是一個固定的搭配,.和*代表可以匹配任意無限多個字符,加上?表示使用非貪婪模式進行匹配,也就是我們會盡可能短地做匹配
2)(.*?)代表一個分組,如果有5個(.*?)就說明匹配了五個分組
3) 正則表達式中,“.”的作用是匹配除“\n”以外的任何字符,也就是說,它是在一行中進行匹配。這里的“行”是以“\n”進行區(qū)分的。HTML標簽每行的末尾有一個“\n”,不過它不可見。 如果不使用re.S參數(shù),則只在每一行內(nèi)進行匹配,如果一行沒有,就換下一行重新開始,不會跨行。而使用re.S參數(shù)以后,正則表達式會將這個字符串作為一個整體,將“\n”當做一個普通的字符加入到這個字符串中,在整體中進行匹配。
3.保存數(shù)據(jù)
數(shù)據(jù)解析后可以保存到文件或數(shù)據(jù)庫中,這個例子是保存到了文件中,很簡單,就不做說明了,在下篇講如何將數(shù)據(jù)保存到數(shù)據(jù)庫
http://www.dhdzp.com/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)站爬蟲,歡迎star:https://github.com/peiniwan/CreeperTest (本地下載)
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
python socket網(wǎng)絡(luò)編程步驟詳解(socket套接字使用)
這篇文章主要介紹了什么是套接字、PYTHON套接字模塊,提供一個簡單的python socket編程,大家參考使用2013-12-12
Python+DeOldify實現(xiàn)老照片上色功能
DeOldify是一種技術(shù),以彩色和恢復(fù)舊的黑白圖像,甚至電影片段。它是由一個叫Jason?Antic的人開發(fā)和更新的。本文將利用DeOldify實現(xiàn)老照片上色功能,感興趣的可以了解一下2022-06-06
PyQt5內(nèi)嵌瀏覽器注入JavaScript腳本實現(xiàn)自動化操作的代碼實例
今天小編就為大家分享一篇關(guān)于PyQt5內(nèi)嵌瀏覽器注入JavaScript腳本實現(xiàn)自動化操作的代碼實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02
Python實現(xiàn)OFD文件轉(zhuǎn)PDF
OFD 文件是由中國國家標準化管理委員會制定的國家標準,是一種開放式文檔格式,具有高度可擴展性和可編輯性,本文主要介紹了如何利用Python實現(xiàn)OFD文件轉(zhuǎn)PDF,需要的可以參考下2024-10-10

