“人生苦短,我用Python“
前言
在公司来了快一个月了,除了自己的技能,还学到了 AngularJS,最近的项目也是用Python来做,又是一波学习的机会。用了几天发现,我的天呐,这写的真的轻松!!!真是应了那句话:人生苦短,我用Python。在业余时间,了解了其他关于Python有趣的事,比如今天这篇文章的爬虫。
正文
首先得安装Python解析器,公司里用的是Python2.7,那我们去下载吧。
然后就也别在控制台敲什么代码了,直接集成环境吧,下载 PyCharm(idea 家族的软件)
安装购买破解什么什么的就 Google 咯
先来说说爬虫
1.了解爬虫的基本原理及过程
大部分爬虫都是按“发送请求——获得页面——解析页面——抽取并储存内容”这样的流程来进行,这其实也是模拟了我们使用浏览器获取网页信息的过程。
简单来说,我们向服务器发送请求后,会得到返回的页面,通过解析页面之后,我们可以抽取我们想要的那部分信息,并存储在指定的文档或数据库中。
在这部分你可以简单了解 HTTP 协议及网页基础知识,比如 POST\GET、HTML、CSS、JS,简单了解即可,不需要系统学习。
2.学习 Python 包并实现基本的爬虫过程
Python 中爬虫相关的包很多:urllib、requests、bs4、scrapy、pyspider 等,建议你从 requests+Xpath 开始,requests 负责连接网站,返回网页,Xpath 用于解析网页,便于抽取数据。
如果你用过 BeautifulSoup,会发现 Xpath 要省事不少,一层一层检查元素代码的工作,全都省略了。掌握之后,你会发现爬虫的基本套路都差不多,一般的静态网站根本不在话下,小猪、豆瓣、糗事百科、腾讯新闻等基本上都可以上手了。
来看一个爬取我朋友博客的例子:
//*[@id=”docker”]
导入 requests、lxml 模块
使用已有的库,之所以说它好用,就是库多呀。对了,Python2.7 的字符编码问题,要在顶上写一句代码,不然输出中文会报错。
# -*- coding: UTF-8 -*- import requests from lxml import etree
还是可能有编码问题
# -*- coding: UTF-8 -*- import requests from lxml import etree # python2.7 要是报编码问题,就加这三行,python3 不用加 import sys reload(sys) sys.setdefaultencoding('utf8')
我们要抓取的页面链接:http://lifetrut.com/2018/04/14/hello-docker-media/
如果是要抓取所有文章,那就分析这个网站的文章 url 的规则(这里就不做赘述了,我会把这套爬虫完善,爬取朋友博客的文章,并且自动加入我的数据库,毕竟他写的技术文章还是可以的,Luob 的博客)(注:已授权)(再注:他都是在跟我合租,不让爬就不让他住了哈哈哈哈)
# -*- coding: UTF-8 -*- import requests from lxml import etree # python2.7 要是报编码问题,就加这三行,python3 不用加 import sys reload(sys) sys.setdefaultencoding('utf8') # 我们要抓取的页面链接 url = 'http://www.lifetrut.com/2018/04/14/hello-docker-media/'
用 requests 库的 get()方法下载网页
# -*- coding: UTF-8 -*- import requests from lxml import etree # python2.7 要是报编码问题,就加这三行,python3 不用加 import sys reload(sys) sys.setdefaultencoding('utf8') # 我们要抓取的页面链接 url = 'http://www.lifetrut.com/2018/04/14/hello-docker-media/' # 用 requests 库的 get 方法下载网页 r = requests.get(url).text
解析网页并且用 XPath 定位,并输出抓取的文章标题
# -*- coding: UTF-8 -*- import requests from lxml import etree # python2.7 要是报编码问题,就加这三行,python3 不用加 import sys reload(sys) sys.setdefaultencoding('utf8') # 我们要抓取的页面链接 url = 'http://www.lifetrut.com/2018/04/14/hello-docker-media/' # 用 requests 库的 get 方法下载网页 r = requests.get(url).text # 解析网页并且定位节点 s = etree.HTML(r) title = s.xpath("//*[@id=‘docker’]") # 输出抓取的内容 print title
出现问题
1、访问出现了 400。解决方法:加入请求头
2、XPath 用 ID 定位失败,输出空。
3、又是编码问题,输出了字符编码,没有输出中文。
以下是最终的代码示例:
#!/usr/bin/python # -*- coding: UTF-8 -*- import requests from lxml import etree # python2.7 要是报编码问题,就加这三行,python3 不用加 import sys reload(sys) sys.setdefaultencoding('utf8') # 我们要抓取的页面链接 url = 'http://www.lifetrut.com/2018/04/14/hello-docker-media/' header = { 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", 'Accept-Encoding': "gzip, deflate", 'Accept-Language': "zh-CN,zh;q=0.9", 'Cache-Control': "max-age=0", 'Connection': "keep-alive", 'Host': "lifetrut.com", # 'If-Modified-Since' : "Sat, 14 Apr 2018 19:32:34 GMT", 'Upgrade-Insecure-Requests': "1", 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 " "Safari/537.36", 'X-Requested-With': "XMLHttpRequest" } # 用 requests 库的 get 方法下载网页 r = requests.get(url, headers=header).text # print(r) # 解析网页并且定位节点 s = etree.HTML(r) title = s.xpath("//html/body/header/div[2]/div/div/div/h1/text()") print title[0].encode("utf-8")
最后
这只是简单的实现爬虫,我会把其他功能完善,我也是现学现卖,有什么错误欢迎指正,反正我不一定会改哈哈哈哈
大家一起加油