python抓取热门省市公司信息
2018-01-03 本文已影响61人
ilililillililil
先看成果:
dd
image.png

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

一,说明
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三个字段
谢谢阅读。