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

因為期末考試的原因耽擱了好久,大概有一個月沒有寫代碼,手生了,接下來要繼續(xù)努力了。
寫這個爬蟲之前,由于之前用的是2.7,這次決定開始盡量用3.5,其實差別不大。搭建環(huán)境什么的又折騰了一下。記錄一下搭建環(huán)境過程中遇到的問題。
1.Pycharm默認搭建的虛擬環(huán)境pip包沒有不是最新的,盡量升級成最新的,這樣會后面裝別的會少很多坑。
pip和easy_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è)屬性分類的時候特別麻煩。



有些沒有區(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é)果


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