python抓取热门省市公司信息

2018-01-03  本文已影响61人  ilililillililil
先看成果: 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三个字段
                                                    谢谢阅读。
上一篇下一篇

猜你喜欢

热点阅读