企業(yè)黃頁

作業(yè)要求:
抓取http://www.socom.cn 網(wǎng)站公司信息數(shù)據(jù)信息。
可以看這個頁面,有興趣的可以抓全站 至少抓一個省的

預(yù)覽圖

因為期末考試的原因耽擱了好久,大概有一個月沒有寫代碼,手生了,接下來要繼續(xù)努力了。
寫這個爬蟲之前,由于之前用的是2.7,這次決定開始盡量用3.5,其實差別不大。搭建環(huán)境什么的又折騰了一下。記錄一下搭建環(huán)境過程中遇到的問題。
1.Pycharm默認搭建的虛擬環(huán)境pip包沒有不是最新的,盡量升級成最新的,這樣會后面裝別的會少很多坑。
pipeasy_install 參考:http://blog.csdn.net/xsj_blog/article/details/52037609
2.最新的lxml包竟然沒有etee模塊...
解決參考:http://blog.csdn.net/u012614287/article/details/71177920

下面進入正題
乍一看這個網(wǎng)站,感覺賊復(fù)雜,該用什么思路去爬呢?

浙江省頁面

我決定從大標題入手,不走細分的小標題,我走的思路就是直接從浙江省農(nóng)、林、牧、漁業(yè),浙江省采礦業(yè),浙江省制造業(yè)這樣的大標題切入

一級頁面

切入之后,點擊下面紅字,發(fā)現(xiàn)url變了,仔細分析http://www.socom.cn/company/company_list.jsp?categoryId=10&locationId=33&name=&cp=2 categoryId 就是我切入的類目序號,locationId 就是省份序號,cp 是頁碼
只要獲取了所有的這樣的url,就能獲得所有的企業(yè)url。
所有類目url:

    for categoryId in range(10, 31):
        first_url = "http://www.socom.cn/company/company_list.jsp?categoryId=" + str(categoryId) + \
                    "&locationId=33&name=&cp=1"
        page_nums = int(get_total_page(first_url))

        for cp in range(1, page_nums + 1):
            category_url = "http://www.socom.cn/company/company_list.jsp?categoryId=" + str(categoryId) + \
                           "&locationId=33&name=&cp=" + str(cp)
            category_urls.append(category_url)

所有企業(yè)url:

    for url in category_urls:
        html = requests.get(url=url, headers=headers).text
        selector = etree.HTML(html)
        temp_urls = selector.xpath("http://div[6]/div/a/@href")
        for temp_url in temp_urls:
            company_url = "http://www.socom.cn" + temp_url

抓到了企業(yè)url,接下來就是抓信息了。抓信息的時候處理上面的地區(qū)和企業(yè)屬性分類的時候特別麻煩。

image.png
image.png
image.png

有些沒有區(qū)的,有些沒有屬性的,標準的是3+4形式,也有2+4,3+3,3+1等等的形式,思考了半天,想出一個好方法!直接看代碼吧!

Administrative_Region = [
    '上城區(qū)', '下城區(qū)', '江干區(qū)', '拱墅區(qū)', '西湖區(qū)', '濱江區(qū)', '蕭山區(qū)', '余杭區(qū)', '桐廬縣', '淳安縣', '建德市', '富陽區(qū)', '臨安市',
    '海曙區(qū)', '江北區(qū)', '北侖區(qū)', '鎮(zhèn)海區(qū)', '鄞州區(qū)', '奉化區(qū)', '象山縣', '寧??h', '余姚市', '慈溪市',
    '鹿城區(qū)', '龍灣區(qū)', '甌海區(qū)', '洞頭區(qū)', '永嘉縣', '平陽縣', '蒼南縣', '文成縣', '泰順縣', '瑞安市', '樂清市',
    '南湖區(qū)', '秀洲區(qū)', '嘉善縣', '海鹽縣', '海寧市', '平湖市', '桐鄉(xiāng)市',
    '吳興區(qū)', '南潯區(qū)', '德清縣', '長興縣', '安吉縣',
    '越城區(qū)', '柯橋區(qū)', '新昌縣', '諸暨市', '上虞區(qū)', '嵊州市',
    '婺城區(qū)', '金東區(qū)', '武義縣', '浦江縣', '磐安縣', '蘭溪市', '義烏市', '東陽市', '永康市',
    '柯城區(qū)', '衢江區(qū)', '常山縣', '開化縣', '龍游縣', '江山市',
    '椒江區(qū)', '黃巖區(qū)', '路橋區(qū)', '玉環(huán)市', '三門縣', '天臺縣', '仙居縣', '溫嶺市', '臨海市',
    '蓮都區(qū)', '青田縣', '縉云縣', '遂昌縣', '松陽縣', '云和縣', '慶元縣', '景寧縣', '龍泉市'
]

    company_descriptions = selector.xpath("http://div[2]/div/a[position()>1]/text()")
    if company_descriptions[2] in Administrative_Region:
        company_address = company_descriptions[0:3]
        company_attr = '-'.join(company_descriptions[3:])
    else:
        company_address = company_descriptions[0:2]
        company_address.append('')
        company_attr = '-'.join(company_descriptions[2:])
    for address in company_address:
        company_information.append(address)
    company_information.append(company_attr)

用第三個行政區(qū)來劃分是最好的,這樣弄出來的數(shù)據(jù)一致性就會好很多,接下來處理數(shù)據(jù)就會方便很多!

好了,其他的就沒什么了,關(guān)鍵點已經(jīng)解決了,放上完整代碼。

# -*- coding:utf-8 -*-

import requests
from lxml import etree

headers = {
    "User-Agent": "Mozilla / 5.0(Windows NT 6.1;Win64;x64)"
                  "AppleWebKit / 537.36(KHTML, likeGecko)"
                  "Chrome / 58.0.3029.110"
                  "Safari / 537.36"
}

Administrative_Region = [
    '上城區(qū)', '下城區(qū)', '江干區(qū)', '拱墅區(qū)', '西湖區(qū)', '濱江區(qū)', '蕭山區(qū)', '余杭區(qū)', '桐廬縣', '淳安縣', '建德市', '富陽區(qū)', '臨安市',
    '海曙區(qū)', '江北區(qū)', '北侖區(qū)', '鎮(zhèn)海區(qū)', '鄞州區(qū)', '奉化區(qū)', '象山縣', '寧??h', '余姚市', '慈溪市',
    '鹿城區(qū)', '龍灣區(qū)', '甌海區(qū)', '洞頭區(qū)', '永嘉縣', '平陽縣', '蒼南縣', '文成縣', '泰順縣', '瑞安市', '樂清市',
    '南湖區(qū)', '秀洲區(qū)', '嘉善縣', '海鹽縣', '海寧市', '平湖市', '桐鄉(xiāng)市',
    '吳興區(qū)', '南潯區(qū)', '德清縣', '長興縣', '安吉縣',
    '越城區(qū)', '柯橋區(qū)', '新昌縣', '諸暨市', '上虞區(qū)', '嵊州市',
    '婺城區(qū)', '金東區(qū)', '武義縣', '浦江縣', '磐安縣', '蘭溪市', '義烏市', '東陽市', '永康市',
    '柯城區(qū)', '衢江區(qū)', '常山縣', '開化縣', '龍游縣', '江山市',
    '椒江區(qū)', '黃巖區(qū)', '路橋區(qū)', '玉環(huán)市', '三門縣', '天臺縣', '仙居縣', '溫嶺市', '臨海市',
    '蓮都區(qū)', '青田縣', '縉云縣', '遂昌縣', '松陽縣', '云和縣', '慶元縣', '景寧縣', '龍泉市'
]


# def get_first_url():
#    html = requests.get(url=start_url, headers=headers).text
#    selector = etree.HTML(html)
#    first_urls = ["http://www.socom.cn"+str(url) for url in selector.xpath("http://div[@class='provinceBox']/a/@href")]
#    return first_urls


def get_total_page(first_url):
    html = requests.get(url=first_url, headers=headers).text
    selector = etree.HTML(html)
    page_nums = selector.xpath("http://div[@class='description']/table/tr/td[1]/font[2]/text()")[0]
    return page_nums


def get_company_url():
    category_urls = []
    for categoryId in range(10, 31):
        first_url = "http://www.socom.cn/company/company_list.jsp?categoryId=" + str(categoryId) + \
                    "&locationId=33&name=&cp=1"
        page_nums = int(get_total_page(first_url))

        for cp in range(1, page_nums + 1):
            category_url = "http://www.socom.cn/company/company_list.jsp?categoryId=" + str(categoryId) + \
                           "&locationId=33&name=&cp=" + str(cp)
            category_urls.append(category_url)
    for url in category_urls:
        html = requests.get(url=url, headers=headers).text
        selector = etree.HTML(html)
        temp_urls = selector.xpath("http://div[6]/div/a/@href")
        for temp_url in temp_urls:
            company_url = "http://www.socom.cn" + temp_url
            print(company_url)
            get_company_information(company_url)


def get_company_information(company_url):
    company_information = []
    html = requests.get(url=company_url, headers=headers).text
    selector = etree.HTML(html)

    company_name = selector.xpath("http://div[3]/div[1]/text()")[0]
    company_information.append(company_name)

    company_descriptions = selector.xpath("http://div[2]/div/a[position()>1]/text()")
    if company_descriptions[2] in Administrative_Region:
        company_address = company_descriptions[0:3]
        company_attr = '-'.join(company_descriptions[3:])
    else:
        company_address = company_descriptions[0:2]
        company_address.append('')
        company_attr = '-'.join(company_descriptions[2:])
    for address in company_address:
        company_information.append(address)
    company_information.append(company_attr)

    company_details = selector.xpath("http://div[3]/div[2]/div[1]/text()")
    for company_detail in company_details:
        company_information.append(str.replace(company_detail, u'\xa0', u'').strip())
    print(company_information)


if __name__ == "__main__":
    get_company_url()

結(jié)果

結(jié)果
結(jié)果

還算比較整齊的。
寫到數(shù)據(jù)里的部分下次補上,來不及了,先記錄一部分。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容