python爬取IT桔子死亡公司数据库
网络爬虫 . 2019/12/20发布 . shanyonggang_web . 我要评论 . 753阅读

所用库

  • requests

  • xpath解析库

  • multiprocessing多进程

  • pymysql数据库操作库

  • 使用ip代理

实战背景

主要是为了做死亡公司的数据分析,所以对IT桔子死亡公司数据进行相关获取,通过requests请求库进行爬取,xpath进行解析,并将结果存储至mysql数据库中

爬取的url为:https://www.itjuzi.com/deathCompany

源码及数据保存在我的github上:IT桔子死亡公司数据源码及数据

声明:本源码和数据均用于个人学习,请勿商用,如侵犯IT桔子公司权益,请联系我删除!

代码实现

首先分析网页:

打开我们需要爬取得网页,我们点击第一页、第二页、第三页等等,发现搜索引擎中的url没有变化,因此判断其是通过ajax请求进行加载的,打开调试,发现如下:

最终发现,其通过这个ur(https://www.itjuzi.com/api/closure?com_prov=&sort=&page=1&keyword=&cat_id=)l进行请求数据的,其中page为变化的,表示页数,我们将该页请求数据进行json格式化:

最终发现其数据即为我们需要的数据,接下来编写代码,如下:

import requests 
from xici import proxy
import pymysql
import multiprocessing
import time
import random
import requests

def get_data(json_url,proxies):
    user_agent_list = [
        # Opera
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60",
        "Opera/8.0 (Windows NT 5.1; U; en)",
        "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50",
        # Firefox
        "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0",
        "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10",
        # Safari
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
        # chrome
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
        # 360
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36",
        "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
        # 淘宝浏览器
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
        # 猎豹浏览器
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
        # QQ浏览器
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
        # sogou浏览器
        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)",
        # maxthon浏览器
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36",
        # UC浏览器
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36",
    ]
    UserAgent = random.choice(user_agent_list)
    # print(UserAgent)
    headers = {
        'User-Agent': UserAgent,
    }
    try:
        json_data = requests.get(json_url,headers=headers,proxies=proxies)
        if json_data.status_code is 200:
            deatail_infos = json_data.json()['data']['info']
            for data in deatail_infos:
                # 公司名称
                com_name = data['com_name']
                # 公司简介
                com_description = data['com_des']
                # 公司创建时间
                com_born = data['born']
                # 公司关闭时间
                com_change_close_date = data['com_change_close_date']
                # 公司类型
                com_style = data['cat_name'] + data['se_cat_name']
                # 公司地址
                com_position = data['com_prov']
                # 公司创始人
                com_team = data['com_team']
                com_people = ''
                for name in com_team:
                    com_people += name['name'] + '/' + name['per_des'] + ';'
                # 公司标签
                com_tag = data['com_tag']
                com_tags = ''
                for tag in com_tag:
                    com_tags += tag['tag_name'] + '/'
                # 投资轮次
                com_fund_status_name = data['com_fund_status_name']
                # 投资公司
                com_invst = data['com_invst']
                com_invsts = ''
                for com in com_invst:
                    com_invsts += com['invst_name'] + '/'
                # 公司死亡原因
                closure_type = data['closure_type']
                death_reason = ''
                for da in closure_type:
                    death_reason += da['name'] + '/'
                db = pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='spider_data')
                cursor = db.cursor()
                sql = 'INSERT INTO juzi_death_company_all_info(com_name,com_description,com_born,com_change_close_date,com_style,com_position,com_people,com_tags,com_fund_status_name,com_invsts,death_reason) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
                try:
                    cursor.execute(sql,(com_name,com_description,com_born,com_change_close_date,com_style,com_position,com_people,com_tags,com_fund_status_name,com_invsts,death_reason))
                    db.commit()
                    print('{}数据写入成功!!!'.format(com_name))
                except:
                    print('数据写入失败!')
                    db.rollback()
        else:
            print('{}访问不了了!!!'.format(json_url))
    except:
        print("{}数据爬取失败".format(json_url))

if __name__ == "__main__":
    start = time.time()
    print('当前环境CPU核数是:{}核'.format(multiprocessing.cpu_count()))
    json_urls = [ 'https://www.itjuzi.com/api/closure?com_prov=&sort=&page={}&keyword=&cat_id='.format(i) for i in range(1,629)]
    p = multiprocessing.Pool(4) 
    i = 1
    proxies = proxy.get_proxy_random()
    for json_url in json_urls:
        if (i%35 == 0):
            proxy.get_proxy_random()
        p.apply_async(get_data,args=(json_url,proxies,))
        i += 1
    p.close()
    p.join()
    print('总耗时:%.5f秒'% float(time.time()-start))

其代码比较简单,就是使用requests进行url请求,然后解析返回的json数据,并将结果存储在数据库中,需要注意的是,IT桔子使用了反爬虫,大致是针对IP,如果一个IP访问次数超过三四十次,就会显示一段时间后才能访问,我们可以使用代理ip的形式进行数据的爬取,最终爬取得结果如下:

这样我们就实现了IT桔子死亡公司的数据获取

总结

本文实现了数据的获取,后续针对爬取得数据进行相应的数据分析,看能不能挖掘分析出点有意思的东西。


  • 有疑问请在下方评论区留言,我会尽快回复。
  • Email私信我: 511248513@qq.com 或添加博主 微信
本文作者:shanyonggang_web
发布时间:2019年12月20日 13:37
许可协议: 署名-非商业性使用 4.0 国际许可协议
知识共享许可协议     转载请保留原文链接及作者
正在加载今日诗词....
您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击下面的


登录 后回复

当前暂无评论,点击登录来做第一个吃螃蟹的人吧!