上篇說道钓账,我們能夠通過指定的URL來獲取政府工作報告址芯,但是怎樣能夠但是一遍遍粘貼地址和運行代碼也有大量重復(fù)的工作陕靠,也就是我想直接輸入?yún)R編地址蝶柿,就會自動把當(dāng)前年份所有省份的文本獲取下來杈曲。既然我們能夠通過URL獲取工作報告驰凛,那么我就只要獲取它的URL地址不就好了么胸懈。
那么這一篇和上篇的思路是一樣的,只不過是把獲取的報告的文字換成了URL罷了恰响。
請求
url = "http://www.gov.cn/guoqing/2016-02/21/content_5044277.htm"
page = urllib2.urlopen(url).read().replace('http://www.gov.cn/govweb/xhtml/favicon.ico', '').replace(' ', '').replace('<strong>', '').replace('</strong>', '').replace('</br>', '').decode("utf8").split(' ')
page = ''.join(page)
簡單解釋一下趣钱,read()后來這么多代碼也就是把一些網(wǎng)頁標(biāo)簽中不需要的空格,加粗胚宦,換行給去除掉而已
解析
通過谷歌瀏覽器自帶的開發(fā)者工具首有,檢查北京和天津的元素可以發(fā)現(xiàn)如下圖
看到這個統(tǒng)一的格式就覺得有戲,我們可以通過正則表達式來爬取枢劝。
我們需要的數(shù)據(jù)是超鏈接和省份信息井联,那么紅框部分基本上都是我們想要的。
那么我們只要匹配這類數(shù)據(jù)再把需要的部分用中括號括起來就行了(不懂得回去看看正則表達式)
re.findall('"(http://www.gov.*?)".*?[\u4e00-\u9fa5]*?<', page, re.S)
但是這樣匹配以后會發(fā)現(xiàn)問題您旁,許多除了省份的超鏈接意外烙常,其他的例如圖片的超鏈接進去了,跳轉(zhuǎn)其他頁面的超鏈接進去了鹤盒。
然后我通過查看各個混進來的超鏈接的格式發(fā)現(xiàn)與省份超鏈接不大一樣军掂,這樣的話我想到了一個辦法,通過把正則表達式的精確度提高昨悼,把其他混進來的鏈接給過濾掉蝗锥,但是發(fā)現(xiàn)仍有小部分的鏈接是無法被過濾掉了,這樣就對我爬取帶來了極大的困擾率触。為此我想了好久终议,還是通過看省份那部分的網(wǎng)頁代碼,想到了一個辦法葱蝗,
省份數(shù)據(jù)是其他超鏈接中沒有的穴张,那么我只要爬取帶省份關(guān)鍵字的超鏈接不就好了么。于是我的我的正則表達式變成了两曼。
cities = '(北京|天津|河北|山西|內(nèi)蒙古|遼寧|吉林|黑龍江|上海|江蘇|浙江|安徽|福建|江西|' \
'山東|河南|湖北|湖南|廣東|廣西|海南|重慶|四川|貴州|云南|西藏|陜西|甘肅|青海|寧夏|新疆)'
cities = cities.decode('utf8').strip()
re.findall('"(http://www.gov.*?)".*?' + cities + '<', page, re.S)
然后這樣輸出后的結(jié)果非常好 網(wǎng)頁內(nèi)容完全匹配到了省份上皂甘。
儲存
最后,通過正則表達式返回的列表值進行遍歷悼凑,將上篇的內(nèi)容制定成一個函數(shù)偿枕,
將值進入函數(shù)循環(huán)户辫,即可得到自己需要的數(shù)據(jù)渐夸。
def plar_gov_report_spider_save_txt(self, url):
"""爬取地方政府工作報告 并保存為txt文本
:param url:當(dāng)前需要處理的超鏈接值
:return:
"""
# 保存當(dāng)前網(wǎng)頁源碼 并清洗不必要的標(biāo)簽
page = urllib2.urlopen(url).read().decode("utf8").replace(' ', '').replace('<strong>', '').replace(
'</strong>', '').replace('</br>', '')
# 因為 2016 匯編有一處改動 所以在<p> 后面加 ?
myitems = re.findall('<p.*?>(.*?[\u4e00-\u9fa5]*?.*?)</p>', page)