从零开始写Python爬虫 --- 爬虫实践:螺纹钢数据&Cookies

从零开始写Python爬虫 --- 爬虫实践:螺纹钢数据&Cookies

学期末,女票写论文需要 螺纹钢HRB400 20MM两年内的均价数据,这个数据在 我的钢铁网有,但是只免费提供一条一条的数据,如果你需要一定时间内的数据,要付费99元。我只能说太坑了吧!当然,这是难不倒我们的。写个小爬虫把每天的数据爬出来就成。


目标分析:

要爬的数据在我的钢铁网:mysteel.com/



看了一下,居然要登录才能查看数据,这就很尴尬了,

到目前为止我们还没有遇到过这种需要登录才能获取数据的网站。


解决思路:

解决的方式很简答,需要登录我们就登录就好了,有一下三个方式:

  • PhantomJS模拟浏览器登录
  • 通过HTTP的POST请求登录
  • 直接加载cookies登录

三种方法各有各的好处:

第一种方式用起来简单,但是效率慢
第二种登录时需要准备挺久,但是一劳永逸
第三种简单又方便,但是对某些网站不适用

我综合考虑了一下,既然只是为了抓几百条数据,也没必要弄得那么复杂,直接用传输cookies的方式就成。


关于Cookies:

有些同学可能没有听说过cookies,先来看一下wiki百科的定义:

Cookie(复数形态Cookies),中文名称为“小型文本文件”或“小甜饼”[1],指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。定义于RFC2109。是网景公司的前雇员卢·蒙特利在1993年3月的发明


简单的来说,cookies就是服务器给你发的一长段随机的数据,这个数据包含着你个人的信息。每次你向服务器发送请求的时候,(如果该请求包含着验证信息)服务器就会通过对比cookies的值来验证你的身份。具体请看 csrf攻击

当然,由于这种验证方式及其不安全,只要懂一点点的网络知识的人,就能轻易盗取你的cookie,从而不需要密码来登录你浏览的网站。

前一段时间,不是还有一个通过公用wifi扫描来获取cookie从而盗取信息的软件吗。总之在新的替代方式推广之前,大家不要在公用的网络环境下用http的web应用啦。


获取登录用的Cookies:

既然是cookies是拿来验证身份信息的,

我们如何获取网站的登录cookies并用到我们的爬虫里去呢?

这里又要用到我们的老朋友chrome开发者工具了:


首先我们需要先注册账号,并登录, 登录完成之后打开:

chrome 开发者工具 --- Network --- 网页

在右边的requests headers里就能找到我们需要的信息了:


我圈出来的那一长串数据,就是我们所需要的cookies了。将它复制下来,一会要用。


代码的书写:

这个爬虫并不难写,只要找到想办法登录上去

就能用bs4 Xpath之类的方式轻松找到我们要的数据,

看代码吧:

import requests
from bs4 import BeautifulSoup
from bs4.element import NavigableString

# 我们刚才获取的cookies,我瞎打的
 raw_cookies = 'sadasdasdasadasdasdsadasdsadasdasdas'

# 我们在用requests传输cookies的时候,需要以字典的形式来传输,
# 下面的代码是将我们复制的一长串数据,通过 分号 分割并组成键值对,放入字典
cookies = {}
for line in raw_cookies.split(';'):
    key, value = line.split('=', 1)
    cookies[key] = value
    

def get_one_data(url, cookies):
    '''
    处理每个页面数据的函数、、
    利用bs4库筛选数据,并写入本地
    '''
    
    # 重点就在这里,我们在发送请求的时候,将登陆用的cookies传了进去,这样就能够获取验证数据了
    r = get_html(url, cookies)
    
    
    soup = BeautifulSoup(r, 'lxml')
    
    # 这里由于网页时间跨度大,所以位置不一样,这就需要判断一下是否抓到了我们需要的数据
    date = soup.find('div', class_='info').contents[1]
    # 判断是否抓到了数据
    if type(date) != NavigableString:
        date = soup.find('div', class_='info').contents[0]

    datalist = soup.find('tr', attrs={'bgcolor': '#FEFBEC'}).contents
    data = datalist[-2].text
    with open('hrb400_20MM.txt', 'a+') as f:
        f.write(date + '\t' + data + '\n')
    print('当前处理日期{}'.format(date))


由于只是想展示一下如何通过设置cookies来登录网站

所以只给出了部分核心的代码,其他边边角角的地方,

想看的同学可以去我的Github上找一找。

当然,看到这里,大家也可用自己的方式去试试爬取一些需要登录的网站数据了


结果的展示:

可以看到,我们一起成功抓到了数据啦。一共抓了500+条数据,传给女票我的任务就完成了,哈哈


这是她在Eviews里做出来的啥趋势图,我也不是很懂:




出问题了?


不是我说,这个网站防护功能做的真是好,

当天晚上爬的,第二天早上账号就被发现异常了,

谁教人家是靠卖数据吃饭的呢。


这里使用cookies的登录方式,

怎么说呢,比较鸡贼

过两天有空我在写一篇通过post请求来登录网站的文章吧~



每天的学习记录都会 同步更新到:
微信公众号: findyourownway

知乎专栏:从零开始写Python爬虫 - 知乎专栏

blog : www.ehcoblog.ml

Github: Ehco1996/Python-crawler

编辑于 2017-06-03

文章被以下专栏收录