美文网首页
python抓取热门省市公司信息

python抓取热门省市公司信息

作者: ilililillililil | 来源:发表于2018-01-03 16:03 被阅读61次
    先看成果: dd

    Mysql:执行查询语句
    select * from companyall order by id desc;

    公司信息 image.png

    一,说明

    1.目标网站:www.jobui.com    职友集
    
    2.实现内容:爬取20个热门城市的50个行业的所有公司信息
    
    3.使用工具:Python,MySQL,IDE=Pycharm
    
    4.使用的库:requests,re,BeautifulSoup,pymysql,multiprocessing
    

    二,分析网站

    http://www.jobui.com/rank/company/view/guangzhou/dianzi/2013/?pn=1
    1.通过对url中的guangzhou字段做更变,可以切换城市
    2.dianzi字符段做更变,可以切换行业
    3.?pn字段切换可以切换页码
    http://www.jobui.com/company/1236/
    4.进入公司信息后对1236字段进行更变,可以获取公司信息
    
    难点:
             1.同时对链接中的多个字段进行变换,怎么掌握次序?
    解决方案:
             1.抓取城市信息,迭代进入电子,
             2.抓取所有行业信息,迭代进入pn页码
             3.通过对页码的切换,获取以数字代替的公司信息,生成最终链接
     结果:请看代码
    

    二,思路

    1.首先类似于
    http://www.jobui.com/rank/company/view/guangzhou/
    http://www.jobui.com/company/1236/
    这样的链接,我们通过对,上述几个字段的变化,得到公司信息
    

    三,上源码

    import requests
    from bs4 import BeautifulSoup
    import re
    import time
    import pymysql
    from multiprocessing import Pool
    
    #使用pymysql导入MySQL数据库
    conn = pymysql.Connect(host='xx', user='xx', password='xx', database='xx', port=123,charset='xx')
    cursor = conn.cursor()
    
    #对代表公司的数字,进请求得到公司信息
    def get_url(number_add):
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.3964.2 Safari/537.36',
            'Host': 'www.jobui.com',
            'Referer': 'http://www.jobui.com/rank/company/view/shenzhen/zhuangxiuzhuangshi/2013/'}
        url = 'http://www.jobui.com/company/{}/'.format(number_add)
        try:
            response = requests.get(url, headers=headers).text
            # print(response)
            parse_html(response)
    
        except Exception as e:
            print(e)
    
    
    #解析公司中需要的数据
    def parse_html(html_url):
        try:
            soup = BeautifulSoup(html_url, 'lxml')
            text = soup.find_all('div', class_='astruct cfix cover')
            company_name = soup.find('h1', class_='phead-h')
            # print(company_name['data-cityname'])
            company_city1 = company_name['data-cityname']  # 公司城市
    
            # print(company_name['data-companyname'])
            company_name1 = company_name['data-companyname']  # 公司名字
        except:
            print('parser,html,Error')
        else:
            for item in text:
                intros = item.find('p', class_='mb10 cmp-txtshow').get_text().strip()  # 公司大简介
                intro = item.find('p', class_='mb10 cmp-txtshow').get_text().strip()[:130]  # 公司大简介
                company = item.div.dl.get_text().replace('\n', '')  # 行业,性质
                site = item.find('dl', class_='dlli fs16').get_text().replace('\n', '').replace('(地图)', '').replace(
                    '联系我们:请 登录 后查看', '').strip()  # .strip('看查后录登请:们我联系联系我们:请 登录')   #地址,网址,联系方式
                # 公司,行业,性质,简介,联系方式,网址,地址
    
                print('城市:{}\n公司名称:{}\n公司简介:{}\n{}\n地址及联系:{}\n\n'.format(company_city1, company_name1, intro, company, site))
                ##################导入数据库##################
            #     sql = "INSERT INTO COMPANYALL2(A,B,C)VALUES('城市:%s,公司名称:%s','公司简介:%s%s','\n地址及联系:%s')"
            #     values = (company_city1, company_name1, intro, company, site)
            #     cursor.execute(sql % values)
            #
            # conn.commit()
            # time.sleep(0.5)
    
    #对url中三个参数进行变换,得到代表公司的数字的数字
    def parse_city_number(city_name3, trade, page):
        url_city_number = 'http://www.jobui.com/rank/company/view/{}/{}/2013/?n={}'.format(city_name3, trade, page)
        headers_city_number = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.3964.2 Safari/537.36',
            'Host': 'www.jobui.com',
            'Referer': 'http://www.jobui.com/rank/company/view/shenzhen/zhuangxiuzhuangshi/2013/'}
        response_city_number = requests.get(url_city_number, headers=headers_city_number).text
        try:
            # 公司名字
            soup = BeautifulSoup(response_city_number, 'lxml')
            items = soup.find('ul', class_='atn-module')
            n1 = items.find_all('li', class_='listPd')
            for n2 in n1:
                number_1 = n2.a['href']
                number_2 = str(number_1).replace('/', '')[-8:]
                number_3 = re.findall('\d+', number_2)[0]
                #number_3是公司的名称以数字形式代表
                get_url(number_3)
        except:
            pass
    
    #处理上述难点,掌握变换次序
    def min():
        url = 'http://www.jobui.com/rank/company/view/shenzhen/zhuangxiuzhuangshi/2013/'  # 这是一个地区的信息
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.3964.2 Safari/537.36',
            'Host': 'www.jobui.com',
            'Referer': 'http://www.jobui.com/rank/company/view/shenzhen/zhuangxiuzhuangshi/2013/'}
        response = requests.get(url, headers=headers).text
        soup = BeautifulSoup(response, 'lxml')
        # 行业名字############################################
        soup = BeautifulSoup(response, 'lxml')
        trade = soup.find_all('div', attrs={'class': 'selected'})
        for trades in trade:
            names = trades.find_all('a')
            for tradess in names:
                trade = tradess['href'].strip().replace('/', ',').split(',')[5]
                # trade=行业名字,迭代进url
       #######################################################
                city1 = soup.find_all('div', attrs={'id': 'tab1'})
                for city_name in city1:  
                    city_name1 = city_name.find_all('a')
                    for aa in city_name1:
                        city_name2 = aa['href'].split('/')[4]
                        ####### city_name2=城市名字,迭代进url
                        for page in range(1, 16):
                            page = page
                           #######page为页码,设置为1-15页,迭代进url
                            try:
                                pass
                                #普通抓取
                                #parse_city_number(city_name2, trade, page)
    
    
                                # #####################多进程###################
                                pool =Pool()
                                pool.map(parse_city_number(city_name2,trade,page=page),page)
                                pool.close()
                                pool.join()
                                print('城市###%s,行业###%s,页数###%s' % (city_name2, trade, page))
    
                                ############测试状态##############
                                # print(trade)
                                # print(city_name2)
                                # print(page)
                            except:
    
                                print('min.except')
    
    
    
    if __name__ == '__main__':
    
        try:
            min()
    
            ########关闭数据库
            cursor.close()
            conn.close()
            print('关闭pymysql')
            ######################
     
        except:
            print('tail!!!!!!!')
    
    
    
    
    

    最后:

    1.copy到IDE后需要填上数据库信息
    2.记得要先创建好A,B,C三个字段
                                                        谢谢阅读。
    

    相关文章

      网友评论

          本文标题:python抓取热门省市公司信息

          本文链接:https://www.haomeiwen.com/subject/mlwhnxtx.html