作业要求:票牛网http://www.piaoniu.com/cd-dramas/hottest
目标内容:爬取演出信息,包括演出名称、详细网址、时间、地址、票价等内容
任务要求:使用xpath完成,结果保存到csv文件中

涉及知识点:requests获取网页源代码、xpath获取内容、python读写CSV文件

先说说Xpath与上一次的正则表达式有何区别?

通过上一次实验知道通过用正则表达式来提取信息,经常会出现不明原因的无法提取想要内容的情况,即有时无法直接获取信息。最后即便绞尽脑汁终于把想要的内容提取了出来,但发现浪费了太多的时间。

但我们需要寻找的内容越复杂,构造正则表达式所需要花费的时间也就越多,而XPath却不一样,构造不同的XPath,所需要花费的时间几乎是一样的,所以用XPath从HTML源代码中提取信息可以大大提高效率。一句话就是,xpath是直接找地址

那么在构造XPath语句的过程中,我们需要寻找“标志性”的标签。可以直接使用浏览器的开发者工具来协助分析网页结构,可以提高分析效率,如下图

用java抢演唱会的票 演唱会抢票python_爬虫


即可使用Xpath

步骤如下

*第一步

import lxml.html
import requests

path='http://www.piaoniu.com/cd-dramas/hottest'  
html=requests.get(path).content.decode('utf-8')  #获取源代码
selector = lxml.html.fromstring(html)            #通过.fromstring解析html

“网页源代码”利用requests库来获取
第二步:
通过Xpath,直接用浏览器帮助,你懂得噻。分别获取演出名称、详细网址、时间、地址、票价

name = selector.xpath('/html/body/div[2]/div[1]/div[4]/ul/li/div/div[1]/a/@title')
href = selector.xpath('/html/body/div[2]/div[1]/div[4]/ul/li/div/div[1]/a/@href')
time = selector.xpath('/html/body/div[2]/div[1]/div[4]/ul/li/div/div[3]/text()')
address = selector.xpath('/html/body/div[2]/div[1]/div[4]/ul/li/div/a/text()')
price = selector.xpath('/html/body/div[2]/div[1]/div[4]/ul/li/div/div[4]/div[1]/div[1]/span[1]/text()')

在copy-Xpath后,可以明显看到没有text().@title这些东西,但是如果要将它选择出来就要告诉它,相当于那是一个盒子,装了很多东西,你只有明确告诉它,你要的是网址(href)还是(title),还是其他的什么,像标签里面的还有记得加@哦。
另外就是我们是想获取这个网页的所有演出信息,如果真实只用拷贝下来的Xpath,运行之后,你会发现只获取了一个演出信息,这个大家很快就能发现,然后我们再去看其他演出的Xpath,比如我想获取的第一个演出和第二个演出的名称:
第一个:/html/body/div[2]/div[1]/div[4]/ul/li[1]/div/div[1]/a
第二个:/html/body/div[2]/div[1]/div[4]/ul/li[2]/div/div[1]/a
可以发现只它们之间只有li的下标不一样,其他的演出类似。为了可以获取全部的,我们就去掉使它们不同的li的下标,就能达到理想目的。反正就是仔细观察咯,都挺简单。其他的时间什么的类似操作
第三步:

content_list = []       #存放演出信息
for i in range(len(name)):
	dict = {
		'name':name[i],
		'href':'http:'+href[i],
		'time':time[i],
		'address':address[i],
		'price':price[i]
	}
	content_list.append(dict)
print(content_list)

这里就是把它放到字典里面,很以前一样
第四步:
题目要求需存放在.csv文件中,那么这里我们要用到csv库,在.py的同一个目录下创建xxx.csv文件

with open('xxx.csv','w') as csvFile:
    csvWriter = csv.writer(csvFile)
    list = ['演出名称','详情页网址','演出时间','演出地点','票价']    #给.csv的第一行明确列信息
    csvWriter.writerow(list)
    for i in range(len(content_list)):
        csvWriter.writerow(content_list[i].values()) #获取值存入
csvFile.close()  #注意打开文件就需要随时关闭

运行结果:

用java抢演唱会的票 演唱会抢票python_爬虫_02

注意:这里写的都是只能爬取静态的页面,动态是需要跟踪,下次说咯