1.Xpath实例:
from lxml import etree html = ''' <bookstore> <title>新华书店</title> <book href="http://www.langlang2017.com/"> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="zh">Learning XML</title> <price>39.95</price> </book> <book href="www.baidu.com"> <title>python 大全</title> <price>99.95</price> </book> </bookstore> ''' tree = etree.HTML(html)
# (1)获取文档中的所有book节点的第一个book节点 result = tree.xpath("//book[1]") # (2)获取第一个book节点 result = result[0] # (3)获取first_book当前节点下的href result = result.xpath("./@href")
# (4)获取当前节点的父节点下的book节点的href属性 result = result.xpath('..//book/@href') # (5)获取价格小于40的书的书名 result =tree.xpath('//book[price<40]/title/text()') # (6)获取价格等于99.95的书的书名 result = tree.xpath('//book[price=99.95]/title/text()') # (7)获取book标签下面的title和price标签 result =tree.xpath('//book/title|//book/price') # (8)获取属性href含有baidu字符串的book标签,获取此标签的书名 result =tree.xpath('//book[contains(@href,"baidu")]/title/text()') # (9)获取去前面两个属于bookstore标签的字标签的book标签,获取此标签的书名 result =tree.xpath('//bookstore/book[position()<3]/title/text()') # (10)匹配任何属性节点 result =tree.xpath('//*[@*]') # (11)获取所有带有属性title标签,获取此标签的内容 result =tree.xpath('//title[@*]/text()')
2.爬取网站的流程: 1.确定网站哪个url是数据的来源。 2.简要分析一下网站结构,查看数据一般放在哪里。 3.查看是否有分页,解决分页的问题。 4.发送请求,查看response.text里面是否有我们想要的数据内容。 5.如果有数据,就用相应的提取数据的方法提取数据保存。 注意事项: 1.刚开做爬虫项目,先不要用类去做,只需要关注数据的来源等问题的解决,不要关注类结构的设计。 3.可迭代对象: 可迭代对象就是有__iter__属性的对象
迭代器:有__next__属性的对象
两个能转化吗? 使用iter()方法可转化: iter(可迭代对象)----->迭代器。 可迭代对象有哪些: list dict tuple str bytes set 迭代器 生成器 文件流 如何打印一个文件同时输出行号。 fp = open('shabei_spider.py','r',encoding='utf-8') print(fp) #如何输出行号。 for i,c in enumerate(fp,1): print(i,c)
4.反爬措施以及应对措施。 反爬策略: (1)通过use-agent客户端标识来判断是否是爬虫 解决的办法:封装use-agent请求头。 (2)通过访问频率来判断。 解决的办法:设置爬取间隔。 a = random.randint(5) time.sleep(a) (3)封ip 解决的办法:设置代理ip (4)页面内容无法直接获取数据,页面都是js代码。 selenium+phantomjs可以获取页面数据。
5.动态Html页面的处理方法。 1.常见的一些页面技术: (1)js html使我们页面的骨架,css是页面装饰,js是页面的灵魂。 (2)jquery jquery是一个js库,可以是js代码更加简化。 (3)ajax:web页面的异步请求,是一种技术。 (4)DHTML 2.selenium+phantomjs就可以处理这种问题。 (1)selenium:他是web自动测试工具。 pantomjs:他是一个无界面的浏览器。所以他可以运行js代码,帮我们拿到页面数据。 所以selenium+phantomjs就可以解决页面是js代码的这种网站数据的获取问题。 (2)selenium和phantomjs的下载 pip install selenium==2.48.0 百度phantomjs镜像 (3)phantomjs环境变量的配置: 有第三方插件的,都可以放在anaconda/scripts文件下面。 (4)chromedriver chromedriver镜像,注意和自己的chrome浏览器版本对应。