XPATH(lxml)爬蟲測試

# encoding=utf-8 註釋可用中文
from lxml import etree
import requests
import sys

headersIm = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
                    #network headers裏面
html = requests.get('http://www.sohu.com/'headers = headersIm)
html.encoding = 'GBK'
selector = etree.HTML(html.text)

content= selector.xpath('//ul[@sdevindex="6"]/li/a/text()')

for each in content:
    print each

分析搜狐首頁的結構可知,首頁新聞部分是一個div裏面,ul列表屬性sdevindex="6"具有唯一性,而且下面分支爲li/a,想得到文本,最後再加上/text().

若想得到其鏈接,則寫成:

content= selector.xpath('//ul[@sdevindex="6"]/li/a/@href')

打印出來的each 就是每一個內頁鏈接。

最後的換成/@href.

因爲網站多數都是動態網站,由此可知,只要有了相應元素的屬性,和鏈接,以及內頁結構,可以用爬蟲爬取網站中自己感興趣的主要內容。


# encoding=utf-8 註釋可用中文
from lxml import etree
import requests
import sys

headersIm = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
                    #network headers裏面
html = requests.get('http://www.sohu.com/'headers = headersIm)
html.encoding = 'GBK'
selector = etree.HTML(html.text)

content= selector.xpath('//ul[@sdevindex="6"]/li/a/text()')

for each in content:
    print each

分析搜狐首頁的結構可知,首頁新聞部分是一個div裏面,ul列表屬性sdevindex="6"具有唯一性,而且下面分支爲li/a,想得到文本,最後再加上/text().

若想得到其鏈接,則寫成:

content= selector.xpath('//ul[@sdevindex="6"]/li/a/@href')

打印出來的each 就是每一個內頁鏈接。

最後的換成/@href.

因爲網站多數都是動態網站,由此可知,只要有了相應元素的屬性,和鏈接,以及內頁結構,可以用爬蟲爬取網站中自己感興趣的主要內容。

-------------------------------------------------------------------------------------------------------------------------------

# encoding=utf-8 註釋可用中文
from lxml import etree
from multiprocessing.dummy import Pool as ThreadPool
import requests

headersIm = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
                    #network headers裏面
html = requests.get('http://www.cdcedu.com.cn/'headers = headersIm)
selector = etree.HTML(html.text)
content= selector.xpath('//div[starts-with(@id,"tab_a")]/ul/li/a/@title')

for each in content:
    print each

Starts-with(@id,tab_a)即挑選出所有idtab_a開頭的div元素。

然而經過仔細甄別發現,不僅僅是tab_a1 a2 a3,還有別的亂七八糟的東西,所以可以用如下方式,首先構造id的字符串,再找到自己感興趣的內容:

# encoding=utf-8 註釋可用中文
from lxml import etree
from multiprocessing.dummy import Pool as ThreadPool
import requests

headersIm = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
                    #network headers裏面
html = requests.get('http://www.cdcedu.com.cn/'headers = headersIm)
selector = etree.HTML(html.text)

for in range(14):
    idPort = "tab_a"str(x)   #tab_a1 ->tab_a2
    idSelect = "//div[@id=\"+ idPort + "\"]/ul/li/a/@title"
    #print idSelect      #//div[@id="tab_a1"]/ul/li/a/@title
    content = selector.xpath(idSelect)
    for each in content:
        print each

最後得到想要的首頁主要內容的結果:

承德市教育局關於2016年省級學科名師評選市級擬定推薦人選的公示

我市召開提高農村薄弱初中課堂教學實效專題研討會

灤平縣、平泉縣順利通過國家義務教育發展基本均衡縣評估驗收

市長常麗虹就全市教育工作進行專題調研

我市召開學校安全穩定工作會議

2016承德市“廣汽傳祺杯”中小學漢字聽寫大賽總決賽圓滿結束

市教育局黨組理論中心組舉行學習(擴大)會議

隆化縣成立第一屆學科教研團隊

寬城縣弘揚革命老區傳統推進國防教育深入開展

平泉縣優化機制推進縣域師資配置均衡發展

寬城縣舉辦“中國好教師 • 爲夢想插上翅膀 • 名師報告會”

豐寧縣舉行家庭教育專題實訓活動

豐寧縣舉辦首屆小學生足球賽

寬城縣舉行網絡空間人人通平臺培訓活動

興隆縣姚柵子小學獨輪車運動方興未艾

圍場縣第二中學電視臺活躍校園文化生活

木蘭實驗小學召開第五屆“青藍工程”總結會暨第六屆“青藍工程”拜師會

高新區一中邀請優秀畢業生回母校勵志演講

我市舉行《承德新兒歌》系列叢書首發式暨贈書儀式

承德市實驗幼兒園在寬城縣大地鄉中心幼兒園開展精準支教幫扶活動

承德市第四幼兒園開展手拉手幫扶捐贈活動


-----------------------------------------------------------------------

接下來嘗試用多線程,將這些鏈接內頁中的標題和內容提取出來:

# encoding=utf-8 註釋可用中文
from lxml import etree
from multiprocessing.dummy import Pool as ThreadPool
import requests

headersIm = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
                    #network headers裏面


html = requests.get('http://www.cdcedu.com.cn/'headers = headersIm)

#html.encoding = 'GBK'

selector = etree.HTML(html.text)

linkList = [] #構造內頁鏈接

for in range(14):
    idPort = "tab_a"str(x)   #tab_a1 ->tab_a2
    #print idSelect      #//div[@id="tab_a1"]/ul/li/a/@title
    linkText = "//div[@id=\"+ idPort + "\"]/ul/li/a/@href"
    linkContent = selector.xpath(linkText)
    for each in linkContent:
        linkAll = 'http://www.cdcedu.com.cn/+ each
        linkList.append(linkAll)

print linkList


news = []#將最終內容存儲到news列表中
def getAllContent(url):
    html = requests.get(urlheaders=headersIm)

    selector = etree.HTML(html.text)  理解爲序列化
    content_field = selector.xpath('//div[@class="content_box"]')[0]
    info = content_field.xpath('string(.)'#得到div標籤下的所有內容
    news.append(info)

pool = ThreadPool(4)
results = pool.map(getAllContentlinkList)
pool.close()
pool.join()

for co in news:
    print co


測試OK 

也就意味着,可以通過寫多線程爬蟲,上傳到SAE,通過微信公衆平臺,回覆之類的功能,獲取自己感興趣的數據,而不必再打開頁面一點點看了。
回覆天氣二字,公衆平臺通過算法,自動生成xml,比如今天多少度,風力多少,溫度比昨天如何,明天預計溫度多少,風力如何之類的。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章