? ? ?首先筆者也才剛剛接觸python這門奇幻的語(yǔ)言硕淑。python是一個(gè)門檻很低的入門語(yǔ)言,但它的作用一點(diǎn)也不小。YouTube和豆瓣就是用python來(lái)寫的!
筆者將自己的所學(xué)的東西放在這里希望和讀者一起討論尉姨,一起進(jìn)步。
首先吗冤,筆者非常喜歡看電影又厉,然后就上網(wǎng)搜豆瓣電影top250.一共250部,都是非常好看的也經(jīng)典的電影椎瘟。筆者也是一部部在補(bǔ)覆致,感覺人生快要圓滿了!
好了降传,接下來(lái)我們嘗試用python抓取.筆者只想抓取著250部的電影的名字和導(dǎo)演主演的名字和一些簡(jiǎn)介并保存到本地的MySQL數(shù)據(jù)中篷朵。
首先勾怒,筆者喜歡用第三方庫(kù)reuquests,而不是python自帶urllib2(這個(gè)看個(gè)人意愿了)
如果沒有requests庫(kù)的話婆排,可以進(jìn)去cmd命令下:
pip install requests
或者
easy_install requests
或者直接下載文件解壓到python目錄下的lib/site-package中。
#!/usr/bin/env python
#-*-coding: utf-8-*-
import requests
url='https://movie.douban.com/top250'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}
html=requests.get(url,headers=headers)
print html.text
就這么簡(jiǎn)單的幾行代碼我們就已經(jīng)抓取到當(dāng)前頁(yè)面下的HTML啦笔链。
這里的User-Agent是模擬瀏覽器的信息段只,不然可能豆瓣會(huì)不給你進(jìn)行抓取哦。
然后鉴扫,我們就在就抓取關(guān)鍵信息啦赞枕,F(xiàn)12或者鼠標(biāo)右鍵審查元素功能。
審查頁(yè)面的左上角有個(gè)快速定位關(guān)鍵信息的小箭頭。
筆者接下來(lái)使用XPATH來(lái)進(jìn)行抓取炕婶,這里不進(jìn)行多余的解釋了姐赡,有興趣的小伙伴可以去網(wǎng)上搜一下XPath的下載和教程。
#!/usr/bin/env python
#-*-coding: utf-8-*-
import requests
from lxml import etree
url='https://movie.douban.com/top250'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}
html=requests.get(url,headers=headers)
selector=etree.HTML(html.text)
names=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
others=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/p[1]/text()')
nums=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[2]/text()')
evaluates=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[4]/text()')
briefs=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/p[2]/span/text()')
for name,other,num,evaluate,brief in zip(names,others,nums,evaluates,briefs):
print name.encode("utf-8")
print other.encode("utf-8")
print num.encode("utf-8")
printevaluate.encode("utf-8")
print brief.encode("utf-8")
請(qǐng)讀者注意柠掂,將結(jié)果打印出來(lái)的時(shí)候還是要將格式換成utf-8不然還是XML的格式项滑。
這是截圖的一部分。好了涯贞。我們之前的只是一個(gè)頁(yè)面上25部電影的信息枪狂,其他的跟這個(gè)就差不多啦,寫個(gè)href函數(shù)加進(jìn)去就好了宋渔,詳細(xì)見下代碼州疾。
#!/usr/bin/env python
#-*-coding: utf-8-*-
import requests
from lxml import etree
def get_url(url):
? ? url=url
? ? headers={
? ? 'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like ? ? Gecko) Chrome/44.0.2403.157 Safari/537.36'}
? ? html=requests.get(url,headers=headers)
? ? selector=etree.HTML(html.text)
? ? hrefs=selector.xpath('//*[@id="content"]/div/div[1]/div[2]/a/@href')
for href in hrefs:
? ? string=url+href
? ? get_string(string)
defget_string(string):
? ? headers={
? ? 'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}
? ? html=requests.get(string,headers=headers)
? ? selector=etree.HTML(html.text)
? ? names=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
? ? others=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/p[1]/text()')
? ? nums=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[2]/text()')
? ? evaluates=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[4]/text()')
? ? briefs=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/p[2]/span/text()')
for name,other,num,evaluate,brief in zip(names,others,nums,evaluates,briefs):
? ? print name.encode("utf-8")
? ? print other.encode("utf-8")
? ? print num.encode("utf-8")
? ? print evaluate.encode("utf-8") ?
? ? print brief.encode("utf-8")
get_url('https://movie.douban.com/top250')
250部的信息已經(jīng)抓取下來(lái)啦』始穑看看右邊導(dǎo)航條严蓖。
接下來(lái)就是寫進(jìn)數(shù)據(jù)庫(kù)啦。我們要導(dǎo)入MySQLdb這個(gè)包氧急。這個(gè)第三方庫(kù)教程也請(qǐng)讀者自行搜索啦谈飒。因?yàn)楣P者是Mac下的MySQL當(dāng)初安裝這些可是花了好大功夫呢。Windows就簡(jiǎn)單很多呢态蒂。當(dāng)然了筆者是一開始就在數(shù)據(jù)庫(kù)寫入table啦杭措。詳見以下代碼。
#!/usr/bin/env python
#-*-coding: utf-8-*-
import requests
from lxml import etree
import MySQLdb
def get_url(url):
? ? url=url
? ? headers={
? ? 'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}
? ? html=requests.get(url,headers=headers)
? ? selector=etree.HTML(html.text)
? ? hrefs=selector.xpath('//*[@id="content"]/div/div[1]/div[2]/a/@href')
for href in hrefs:
? ? string=url+href
? ?get_string(string)
def get_string(string):
? ? headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}
? ? html=requests.get(string,headers=headers)
? ? selector=etree.HTML(html.text)
? ? names=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
? ? others=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/p[1]/text()')
? ? nums=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[2]/text()')
? ? evaluates=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[4]/text()')
? ? briefs=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/p[2]/span/text()')
for name,other,num,evaluate,briefinzip(names,others,nums,evaluates,briefs):
? ? db=MySQLdb.connect("localhost","root","guanguan5208","dh",charset="utf8")
? ? cursor=db.cursor()
? ? sql="insert into douban (name,other,num,evaluate,brief) values ('%s','%s','%s','%s','%s')"%(name.encode('utf8'),other.encode('utf8'),num.encode('utf8'),evaluate.encode('utf8'),brief.encode('utf8'))
? ? cursor.execute(sql)
? ? db.commit()
? ? db.close()
get_url('https://movie.douban.com/top250')
已經(jīng)打工搞成啦钾恢,我們?nèi)?shù)據(jù)庫(kù)看一下手素。
已經(jīng)導(dǎo)入數(shù)據(jù)里面啦。好開心呀瘩蚪,就根據(jù)這個(gè)順序慢慢來(lái)看啦泉懦。
當(dāng)然了,筆者也是剛剛接觸python這門語(yǔ)言疹瘦,很多東西還不是很懂崩哩,希望讀者輕噴,我也是抱著學(xué)習(xí)的心態(tài)來(lái)學(xué)習(xí)的??言沐。
如果這其中也什么錯(cuò)誤的地方邓嘹,請(qǐng)讀者指正,我將第一時(shí)間修改险胰。