“人生苦短,我用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")
最后
这只是简单的实现爬虫,我会把其他功能完善,我也是现学现卖,有什么错误欢迎指正,反正我不一定会改哈哈哈哈
大家一起加油

