利用python爬虫(案例2)--X凰的一天
學(xué)習(xí)筆記
PS:為啥這個(gè)BLOG是案例2,但是我的BLOG里沒有案例1,那是因?yàn)锽LOG1被鎖了。心痛。
爬取新聞標(biāo)題和鏈接
我想通過Xpath拿到X凰X聞[http://news.ifeng.com/]里的的3條新聞的標(biāo)題和新聞詳情鏈接該咋整呢?
我們先看看網(wǎng)頁(yè)源代碼:
我們看到我們想拿到的3條新聞標(biāo)題都在一個(gè)ul標(biāo)簽中,ul標(biāo)簽有4個(gè)li子節(jié)點(diǎn),每個(gè)li節(jié)點(diǎn)是一個(gè)消息塊。
注意,這里明明有4個(gè)li節(jié)點(diǎn),但為啥我們只爬取3條新聞的信息呢?因?yàn)槠渲杏幸粋€(gè)li節(jié)點(diǎn)包裹的是廣告!!
我們看到,這個(gè)包裹著廣告的li節(jié)點(diǎn)的HTML屬性值和結(jié)構(gòu)(截圖沒有體現(xiàn)出來,但大家可以自己去看)和其他包裹著新聞的li節(jié)點(diǎn)很不一樣。
在包裹新聞的3個(gè)li節(jié)點(diǎn)中,均有一個(gè)a節(jié)點(diǎn),這個(gè)a節(jié)點(diǎn)里包含著新聞詳情鏈接,以及新聞標(biāo)題。由此,我們可以通過這些信息,來思考怎么寫Xpath語(yǔ)句了。
注意:我們得到的新聞詳情鏈接[//news.ifeng.com/c/7vNA0WtAcHg]依然是不完整的,沒有因特網(wǎng)服務(wù)類型(http:),所以在之后的python代碼中,我們要自己加上去。
這里因?yàn)橹皇菍W(xué)習(xí)Xpath匹配,所以就直接把HTML源代碼copy下來,放在一個(gè)txt文件夾里(html_data.txt),再通過python讀取,并匹配,最后將匹配結(jié)果存到mysql數(shù)據(jù)庫(kù)中。
查看我們的mysql數(shù)據(jù)庫(kù)中的news_table數(shù)據(jù)表:
不過多解釋了,直接開始編寫python代碼。但是注意!如果讀取數(shù)據(jù)文件文件時(shí),向下面這樣寫,可能會(huì)報(bào)UnicodeDecodeError錯(cuò)誤:
with open('html_data.txt', 'r') as f:html = f.read()這時(shí),我們可以用二進(jìn)制讀取方式進(jìn)行讀取,再用utf-8編碼格式,進(jìn)行解碼。
完整代碼如下:
# -*- coding: utf-8 -*-from lxml import etree import pymysqlclass FenghuangXpath:def __init__(self):self.db = pymysql.connect(host = '127.0.0.1',port = 3306,user = 'root',password = '19970928',database = 'datacup',charset = 'utf8')self.cur = self.db.cursor() def get_page(self):with open('html_data.txt', 'rb') as f:html = f.read().decode('utf-8')self.parse_page(html)def parse_page(self, html):link_xpath = \ '//ul[@class="news-stream-basic-news-list"]/li[@class="news-stream-newsStream-news-item-has-image clearfix news_item"]//h2/a/@href'name_xpath = \ '//ul[@class="news-stream-basic-news-list"]/li[@class="news-stream-newsStream-news-item-has-image clearfix news_item"]//h2/a/text()'parse_html = etree.HTML(html)link_list = parse_html.xpath(link_xpath)link_list = ['http:{}'.format(i) for i in link_list]name_list = parse_html.xpath(name_xpath)data_zip = zip(name_list, link_list)self.write_data(data_zip)def write_data(self, data_zip):sql = 'insert into news_table(name, news_link) \values(%s, %s);'try:self.cur.executemany(sql, data_zip)self.db.commit()except Exception as e:self.db.rollback()print('錯(cuò)誤信息:', e)def main(self):self.get_page()self.cur.close()self.db.close()if __name__ == '__main__':fengh = FenghuangXpath()fengh.main()查看news_table數(shù)據(jù)表內(nèi)的數(shù)據(jù):
很好,都導(dǎo)入了!
但是知道為啥id不是從1開始么?因?yàn)槲以趧?chuàng)建news_table表時(shí),設(shè)置id為主鍵且自動(dòng)增大。此時(shí),我們就算不傳輸id值,mysql也會(huì)自動(dòng)幫我們填好id值。那這和id為7有啥關(guān)系呢?那是因?yàn)椴┲饕詾橥祽?#xff0c;在利用python傳數(shù)據(jù)時(shí)只傳遞了name和news_link字段,id字段讓mysql自動(dòng)幫博主填寫了。
所以,當(dāng)3條新聞?dòng)涗浀?次導(dǎo)入news_table時(shí),id的確是從1開始的,但是由于博主是個(gè)傻子,代碼敲錯(cuò)了n次,導(dǎo)致傳入的記錄總是不符合要求,所以博主不停的把mysql數(shù)據(jù)庫(kù)里news_table表里的數(shù)據(jù)刪了又刪,直至第3次,導(dǎo)入的數(shù)據(jù)終于符合要求了,但是此時(shí)mysql給我們傳入的id值就是從7開始排列了。悲傷的故事。。。
總結(jié)
以上是生活随笔為你收集整理的利用python爬虫(案例2)--X凰的一天的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用python爬虫(part5)--l
- 下一篇: 新手机上的膜要撕掉么(汉典新字的基本解释