python自学笔记(一)简单爬虫篇

        自学python也有2年了(断断续续的,不是一直学习的那种),所以一直没有学精,时间长了把已经学会的也忘记了,用到的时候还要重新去查资料,很不方便还耽误时间。在这里记录一下已学过一些技能,后期用的时候方便查找,不用再去网上找大量资料再去筛选有用的信息了,同时也希望给新入门的同学一些思路,共同学习,共同成长。

        我是一个纯小白学过来的,在这里建议新手要先把基础打扎实,python的关键词很少,入门很简单,但是想要深入还是要去用心去研究的。同时还要有耐心,因为有些资料在查询的时候,网上给的答案很杂,你需要自己去筛选有用的信息,没有耐心是不行的,有时候为了弄明白一个功能如何实现,我可能要查找几个小时的资料并自己测试可行性,这是很费时间的。当然,你学会了以后对自己的好处也是很大的,下次再有类似的应用就简单的多了,可以举一反三的去实现。

        关于爬虫,因为工作需要,我需要爬取公司的案件数据,并把数据整合起来保存成表格。因为我有一点python的底子,熟悉工作流程之后就开始着手写自己需要的功能,去把一些固定的、重复的工作交给系统来做。

        因为这篇只写一爬虫的内容,就不去详细写其它的内容了。

        首先要爬取公司的网站来获取案件数据(网址是我公司的系统网址,没有用户和密码是登录不上去的,这里只是做个展示,有需要的同学可以找其它的网站爬取内容),我用的requests来爬取(本来想实现模拟登录来着,一直没有研究明白,就略过了,每过一段时间需要自己复制cooking来保证登录成功)。

        首先要找到所需要的网址和headers信息:按F12打开开发人员工具,右边会出现一个窗口,如下:

python自学笔记(一)简单爬虫篇_第1张图片

 点击网络(Network)-> XHR -> 名称(Name)那找找内容,每个网站不一样,要自己去筛选一下。在常规里找到请求的网址,在第三个请求标头里找到所需要的headers信息(红框里是身份标识,也就是cooking):

python自学笔记(一)简单爬虫篇_第2张图片

 

 找到这两个信息之后就可以开始了,先把网址URL和headers(headers的作用是用来模拟浏览器信息的,要不会被反爬)保存上

url = 'http://api.smart-insight-service.com:40423/case_medical?a=paginate&_=1658047475149'
headers = {
        'Accept':
        'application/json, text/javascript, */*; q=0.01',
        'Accept-Encoding':
        'gzip, deflate',
        'Accept-Language':
        'zh-CN,zh;q=0.9',
        'Authorization':
        '',
        'Connection':
        'keep-alive',
        'Host':
        'api.smart-insight-service.com:40423',
        'Origin':
        'http://saas.smart-insight-service.com:40423',
        'Referer':
        'http://saas.smart-insight-service.com:40423/case/case_search/detail.html',
        'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }

 有这些信息其实就可以爬取网站的数据了(Authorization为空是因为不能自动获取,需要手动粘贴过来,而且由于隐私问题我也不能粘贴过来),不过是默认的主页信息,还需要找到关键词来定位到自己需要的信息那里。比如我想找批次号为BJ-GGDE210421的批次信息,就要输入然后查询,对比一下两个URL的不同点(第一个是原网址,第二个是带有参数的网址)

url = 'http://api.smart-insight-service.com:40423/case_medical?a=paginate&_=1658047475149'
url = 'http://api.smart-insight-service.com:40423/case_medical?a=paginate&batch_no=BJ-GGDE210421&_=1658047475152'

看到区别了吗,就是a=XXX后面多了一个&batch_no=BJ-GGDE210421,这个是那个我要查找的批次(刚刚又想到一个思路,可以用表格的形式来实现,看来多写文章也是有好处的,又自学一招红框内可以传参数的时候以表格的形式传入,我知道这个功能,但是不太会用,模拟登录也是这么传参的,后面学习一下)

python自学笔记(一)简单爬虫篇_第3张图片

 

 

是不是和URL的后面是一样的?这是表格传参的好处,看着干净、整洁、易读。

参数传完之后就可以获取数据了,代码如下:

def 获取案件信息(url, headers):
    s = requests.Session()
    s.mount('http://', HTTPAdapter(max_retries=3))
    s.mount('https://', HTTPAdapter(max_retries=3))
    try:
        req = s.get(url=url, headers=headers, timeout=20)
        r = req.json()
        a = r.get('msg')
        if a == '请求成功':
            datas = r.get('data')  # 案件列表要分离2次,案件详情分离1次。

        else:
            datas = a
            print(a)
            
    except Exception as e:
        # 输出错误提示
        print(datetime.now())
        exstr = traceback.format_exc()
        print(f'exstr = {exstr}')
        print(f'e = {e}')
        datas = {}

    return datas

 requests.Session()这个功能不太清楚是做什么了这就是不做注释的后果,各位新同学要以我为戒,千万不要不写注释。(关于用中文,这是我个人的一个想法,对于英文不好的人,用中文来把一些有关联的地方替换掉,很容易就明白什么意思,有助于理解,不过不建议这么做,同学们还是要按照大佬们的建议,规范的写代码,命名也规范命名。要是团队合作,标准是必须要遵守的,我这样只是单打独斗,自己用用就行,团队肯定不合适,我也需要去改。)

max_retries=3这个参数是重连次数,我的是重新连接3次,这个可以根据实际情况设置

timeout=20这个参数就是连接等待时长了,单位是秒,由于我们系统原因,我需要设置时间很长才行,要不会连接失败,这个也是视实际情况设置了。

获取到全部数据后,要用json()这个转换成字典形式,这样好提取数据。我现在需要这个批次下所有的案件号和案件数据,那我就要去知道在哪里去提取。同样F12打开,输入批次号查询,然后点击控制台(上一个批次号只有1个案件,换了一个案件多的批次号,不影响,细致的同学不要纠结哈)

python自学笔记(一)简单爬虫篇_第4张图片

 左边的红框是我想要的信息内容,右边是要提取信息的地方,打开右边的红框

python自学笔记(一)简单爬虫篇_第5张图片

 有以下几个字段,是返回的字典,msg是请求状态,我上面的代码提取这个字段就是判断一下请求成功没有。status是状态码,200是请求成功。重点来了,data字段里才是我们需要的内容,打开看看

python自学笔记(一)简单爬虫篇_第6张图片

 data里面有page字段,这个里面是页面信息,略过。

data里面还有个data字段,是个需要二次提取的,我上面的代码有注释,也是怕自己忘记

 python自学笔记(一)简单爬虫篇_第7张图片

 再次点开data就出现了一个列表,里面就是我所需要的信息了,那么怎么提取出来呢?

def 获取案件信息(url, headers):
    s = requests.Session()
    s.mount('http://', HTTPAdapter(max_retries=3))
    s.mount('https://', HTTPAdapter(max_retries=3))
    try:
        req = s.get(url=url, headers=headers, timeout=20)
        r = req.json()
        a = r.get('msg')
        if a == '请求成功':
            datas = r.get('data')  # 案件列表要分离2次,案件详情分离1次。

        else:
            datas = a
            print(a)

这个函数里已经提取了一次,因为案件详情只要提取一次就行,所以需要提取两次的可以再提取一次,就像是获取字典的值一样方便dataset= r['data']['data'],这样就可以直接提取两了

在这里说一下字典的.get这个用法,看过一些公众号,说这个好用,其实是看怎么用,我把我的字典获取值都改成.get了,然后就发现,代码有点啰嗦了如果你再能确定必定会获取的字典有这些内容,就直接a = 字典['键']来提取值就行,除非是一些不确定的地方,用.get来提取会防止因为没有这个键而导致程度出错停止运行。

下面是把我需要的一些关键数据写成函数批量提取出来

def 提取案件列表个案详情(x):
    if x:
        姓名 = x.get('name')
        批次号 = x.get('batch_no')
        案件号 = x.get('no')
        身份证号 = x.get('id_no')
        上传时间 = x.get('case_data').get('upload_time')
        回传时间 = x.get('case_data').get('send_time')
        案件状态 = x.get('case_status')    # 案件的各种状态,可检查核查状态
        案件id = x.get('case_id')
        审核员 = x.get('user').get('nickname')
        理算状态 = x.get('adjuster_name')
        理算标识 = x.get('adjuster_status')
        身份证号 = x.get('id_no')
        核查状态 = x.get('check_name')  # 和核查校验是一个
        核查校验 = x.get('is_check')

        data = {
            '姓名': 姓名,
            '批次号': 批次号,
            '案件号': 案件号,
            '身份证号': 身份证号,
            '上传时间': 上传时间,
            '回传时间': 回传时间,
            '案件状态': 案件状态,
            '案件id': 案件id,
            '审核员': 审核员,
            '核查状态': 核查状态,
            '理算状态': 理算状态,
            '理算标识': 理算标识,
            '身份证号': 身份证号,
            '核查校验': 核查校验
        }
    else:
        data = {}
        print('没有案件列表信息')
    return data

看看那么多.get 有什么感想,我看着是有点别扭的,不过费了半天时间把所有函数都改了,就不动了,后面我重新写程序的时候就不这么写了

上面的代码就是把列表内所有的案件的信息都提取出来了,这只是提取一条的数据,还要用for循环来获取列表里的全部内容,下面是个代码示例:

for x in datas:
    a = 提取案件列表个案详情(x)
    

这样我所需要的内容就全部提取出来存入字典里了,然后就是写入excel表格导出来了,那就是另一个文章啦

看,其实爬虫就是这么简单,当然,我要学习的地方还很多。比如用lxml来提取网页面的数据,还有个多协程的库,好像比requests库还好,接下来学习学习。

个人感悟:学习不是你学习了多少,而是你用上了多少,只有你用上的,才是有用的,所以学python不要想着我把这些都学完再写程序,那样是学习不好的,每天都会有大量的库更新,会有更好的库出现,你永远学不完,把自己能用上的学好就行,不是学的多就好。学以致用,就这样。

你可能感兴趣的:(爬虫,python,网络爬虫)