在当今大数据时代,数据是比较值钱的东西。很多数据是你拿不到的,要靠自己收集。有一种方法叫爬虫。就是通过爬取网页内容,获得想要的数据。
我们爬取数据能干什么。这就看你的需求。比如有人可以爬网站,下载资源(电影,歌曲,文档,书籍等)
有人可以爬取网站,获取资讯,如爬股票网站,获取股票历史数据;为自己的投资做参考。
爬取招聘网站,可以了解工作机会。
爬取房产网站,获取房价走势,决定出手时机。
爬取行业网站,可以获取行业动态。。。
甚至可以爬取娱乐信息,自动发到自己邮箱,或者微信上,图个开心。
一般我们可以爬取海量数据,通过整理,分析,用图形化展现出来。
在爬取的过程中,可能遇到各种问题,于是就出现了分布式爬虫,爬虫框架,反扒虫等等。
本文这里不搞那么复杂,就是简单用python的一个requests库来实现爬虫。
Requests是一个基于Apache2协议开源的Python HTTP库,号称是“为人类准备的HTTP库”。
Python中,系统自带的urllib和urllib2都提供了功能强大的HTTP支持,但是API接口确实太难用了。requests作为更高一层的封装,用起来简单快捷。
首先得安装:
利用 pip 安装
pip install requests
先看看几个常用的方法和属性:
1.requests.Session()这样就可以在会话中保留状态,保持cookie等
2.requests.get()获取某个网页
3.requests.post()发送post请求,类似的,post时也可以发送数据(使用data参数)和定制请求头(使用headers参数)。
一些常用的属性:
result=requests.post(url,data,headers)
result.text #可以获取响应的内容如抓回来的网页
result. encoding='utf-8' #有时回来的是乱码,改变编码以使其正常显示根据实际情况改变编码utf-8、gb2312等
result. content #可以获取二进制内容,如抓取登陆时的验证码等非字符资源
result.cookies #可以查看当前保存的cookie情况
result. status_code #可以查看HTTP状态码(如200 OK、404 Not Found等)
result.url #可以查看当前请求的网址</pre>
有时候我们需要传送的信息不是表单形式的,需要我们传JSON格式的数据过去,所以我们可以用 json.dumps() 方法把表单数据序列化。
import json
import requests
url = 'http://xxx'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload))
print r.text
Cookies
如果一个响应中包含了cookie,那么我们可以利用 cookies 变量来拿到
import requests
url = 'http://example.com'
r = requests.get(url)
print r.cookies
print r.cookies['example_cookie_name']
超时配置
可以利用 timeout 变量来配置最大请求时间
requests.get('http://github.com', timeout=0.001)
注:timeout 仅对连接过程有效,与响应体的下载无关
Sessions
如果我们要打开多个URL,也就是我们每次发新的请求,使用不同浏览器打开,后面的无法获取cookies。
如果要保持一个持久会话怎么办呢?
解决方案如下
import requests
s = requests.Session()
s.get('http://xxx/login')
r = s.get("http://xxx/home")
print(r.text)
相当于有个全局变量,第一个的cookies存到了全局变量里面,后年的直接拿来用就可以了。
SSL证书验证
现在随处可见 https 开头的网站,Requests可以为HTTPS请求验证SSL证书,就像web浏览器一样。要想检查某个主机的SSL证书,你可以使用 verify 参数。
如果你不想验证,只要设置为False即可,否则会爆如下错误:
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)
解决方案:
import requests
r = requests.get('https://kyfw.12306.cn/otn/', verify=False)
print r.text
代理
如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求。
因为很多网站都有反爬措施,限制IP。一般都会考虑用ip池来爬。
import requests
proxies = {
"https": "http://xxx"
}
r = requests.post("http://yyy", proxies=proxies)
print r.text
好了,掌握了这些知识,就可以开干了。我们以爬取testerhome的topic为例,看每天大家都在关注什么。
这里用requests+beautifulsoup来实现,beautifulsoup主要是用来定位坐标,以后会讲。
首先,用浏览器的开发者工具,打开看看我们请求需要传什么参数(当然这里不用登陆也可以爬取,但是大多数还是需要登陆的)
定位到我们需要定位的元素:
写代码执行,效果是这样的:
很简单吧!我这里只是简单把数据给抓取了,没有写入excel,或者数据库。也没有去分析和展示出来。
当然你有精力,可以进一步加工。用词云展现出来。
代码:
import requests
from bs4 import BeautifulSoup
import re
s = requests.Session()
username = "安蜀黍"
password = "snake"
login_url = "https://testerhome.com/account/sign_in"
search_url= "https://testerhome.com/topics/last"
result = s.post(url=login_url,data={
"user[login]":username,"user[password]":password,"commit":"登陆"})
print(result.status_code)
print(result.cookies)
page = s.get(search_url)
# soup = BeautifulSoup(page.content, 'html5lib')
soup = BeautifulSoup(page.content, 'lxml')
target = soup.select('div.title.media-heading a')
for title in target:
find_result = re.search(r'title="(.*?)"',str(title))
if find_result !=None:
print(find_result.group(1))
更多精彩,就在微信公众号: python爱好部落