1.环境准备
python3.6
pycharm
安装requests库,pip install requests
2.XPath语法
XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。XML实例文档
Harry Potter29.99
Learning XML39.95
常用路径表达式
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性实例
bookstore 选取bookstore元素的所有子节点
/bookstore 选取根元素bookstore
bookstore/book 选取属于bookstore的子元素的所有book元素
//book 选择所有book子元素,而不管它们在文档中的位置
bookstore//book 选取属于bookstore元素的后代的所有book元素,而不管它们位于
bookstore之下的什么位置
// @ lang 选取名为lang的所有属性
3.猫眼爬虫实例
import requests
import json
from lxml import etree
# 爬取一个网页
def getOne(n):
#模拟浏览器访问模式,防止拒绝访问
header = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
r = requests.get(url, headers=header)
return r.text
#data = getOne(10)
#print(data)
def parse(text):
#初始化 标准化
html = etree.HTML(text)
#提取我们想要的信息,需要写xpath语法
#提取电影名 names xpath返回列表
names = html.xpath('//div[@class="movie-item-info"]/p[@class="name"]/a/@title')
#提取上映时间
releasetimes = html.xpath('//p[@class="releasetime"]/text()')
items = {}
for name,releasetime in zip(names,releasetimes):
items['name'] = name
items['releasetime'] = releasetime
#生成器,循环迭代,yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。
yield items
#保存数据
def save2File(data):
with open('movie.json','a',encoding='utf-8') as f:
#把字典和列表转化为字符串
data = json.dumps(data,ensure_ascii=False) + ',\n'
f.write(data)
def run():
for n in range(0,10):
text = getOne(n)
items = parse(text)
for item in items:
print(item)
save2File(item)
if __name__ == '__main__':
run()
扩展函数:zip(a,b)拉链函数,序列解包
a = [1,2,3,4,5]
b = ['a','b','c','d','e']
it = {}
for c,d in zip(a,b):
it['c'] = c
it['d'] = d
print(it)
JSON模块之dumps
json.dumps
将Python对象编码成字符串
import json
data = {'a':1,'b':2,'c':3,'d':4,'e':5}
jsonDumps = json.dumps(data)
jsonLoads = json.loads(jsonDumps)
print(jsonDumps,type(jsonDumps))
print(jsonLoads,type(jsonLoads))
输出:
{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
写入文件一
f = open()
f.write()
f.close()
写入文件二(自动关闭文件)
保存文件:
with open() as f:
f.write()
按行读取:
with open() as f:
for line in f:
print(line)
#do something