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,比如今天多少度,风力多少,温度比昨天如何,明天预计温度多少,风力如何之类的。 

猜你喜欢

转载自blog.csdn.net/limaning/article/details/53725089