【第一个爬虫】python爬取58同城企业信息并插入数据库

import urllib
import urllib2
import HTMLParser
from bs4 import BeautifulSoup
import re
import MySQLdb as mdb
import json

i=1 #number order of companys
def GetOnePageUrl(url):
	global i
	flag = 0
	request = urllib2.Request(url)
	html = urllib2.urlopen(request)
	soup = BeautifulSoup(html, "lxml")
	for link in soup.find_all(name='a', attrs={"href": re.compile(r'^http://qy.58.com/mq/[0-9]*/$')}):
		#print link.get('href')
		if flag%2 == 0:
			GetOneUrlInfo(link.get('href'))
			print i
			i += 1
		flag += 1

def GetOneUrlInfo(url):
	global i
	request = urllib2.Request(url)
	html = urllib2.urlopen(request)
	soup = BeautifulSoup(html,"lxml")
	#for addr in soup.find_all(name='td',limit=5):
	#   print addr.string
	fiveinfo = soup.find_all(name='td',limit=5)
	if len(fiveinfo) == 0: #the company's link go to website which made by itself
		return
	co_name = fiveinfo[0].string
	co_type = fiveinfo[1].string
	co_numpeople = fiveinfo[2].string
	co_manager= fiveinfo[4].string
	co_tel_addr = "/tmp/pic/" + str(i) + "tel.gif"
	co_email_addr = "/tmp/pic/" + str(i) + "email.gif"
	co_connect_all = soup.find_all(name='a', attrs={"href": re.compile(r'^http://[\s\S]*.5858.com$')})
	if len(co_connect_all) != 0:
		co_connect = co_connect_all[0].get('href')
	else:
		co_connect = "the link is not formative" #company's link isn't formative

#mysql
	conn = mdb.connect(host='127.0.0.1',port=3306,user='root', passwd='password',db='co58',charset='utf8')
	cursor = conn.cursor()
	cursor.execute("insert into 58co values('%d','%s','%s','%s','%s','%s','%s','%s')"%(i,co_name,co_type,co_numpeople,co_manager,co_tel_addr,co_email_addr,co_connect))
	cursor.close()
	conn.commit()
	conn.close()

#save images
	strtel = 'tel'
	stremail = 'email'
	flag = 0
	for link in soup.find_all(name='img', attrs={"src": re.compile(r'^http://image.58.com/showphone.aspx.[\s\S]*')}):
	    #print link.get('src')
	    if flag == 0:
	    	f = open(str(i)+strtel+'.gif','wb')
	    	flag += 1
	    else:
	        f = open(str(i)+stremail+'.gif','wb')
	        flag -=1
	    #f = open(str(i)+'.gif','wb')
	    req = urllib2.urlopen(link.get('src'))
	    buf = req.read()
	    f.write(buf)

#there are ten pages
j = 1
while j <= 10:
    url = 'http://nj.58.com/yewu/pn' + str(j) + '/?jobfrom=mingqi'
    GetOnePageUrl(url)
    j += 1

在ubuntu 16.04 lts 下,python2.7, MySQL 5.7,编辑器sublime text 3

安装的开发环境废了好长时间,python的包安装也麻烦,之前在win7 64位系统中安装mysqldb包一直没装上,后来在别的电脑上试了一下,mysqlconnect啥的包可以替代,好像说是正统的包

用的beautif soup包,连接mysql也弄了半天,导出到excel也是用的第三方软件,直接导出到excel好像安全方面有点问题

因为58上企业电话号码和邮箱地址是以图片形式给出的,所以就把图片下载到本地

两种解决方案:

1、图片直接放入excel对应行,但是好像不怎么好搞,把本地图片的超链接存入对应单元格还是没问题的,但是查看的时候还要点击链接才能打开图片不方便,用宏的话录制脚本又达不到要求

2、就是识别图片中号码和邮箱地址,这个工程量感觉不小,感觉要使用机器学习方面的知识

      找了个第三方软件中文名好像叫“泰比”的俄罗斯软件,识别效果很好,就是不知道批量识别速度如何,关键这软件不便宜。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

更新

 添加爬取公司地址

addr = soup.find_all(name = 'span')
co_addr = addr[18].string

mysql插入语句也要修改,就不赘述了

下面来说一个mysql中表导出为excel表格的问题,当然在ubuntu中是LibreOffice Calc这个软件,文件后缀是ods,不过显然不要紧

1、首先在控制台进入mysql

2、选中想导出的数据库

3、执行检查安全设置语句

show variables like '%secure%';
我的是secure_file_priv         /var/lib/mysql-files/

意思你想导出文件只能导出到这个指定的目录下

4、导出到上述指定的目录中

比如:

select * from tablename into outfile ’/var/lib/mysql-files/filename.xls‘;
这时控制台会显示:query ok, 多少多少rows affected

说明文件已经导出到了/var/lib/mysql-files目录下了

但是你直接去找会发现你居然看不了!!!说你没有权限!!!WTF!!!电脑不是买的吗?系统不是我装的吗?我难道还没有权限?一万只草泥马奔腾。。。

别砸电脑,毕竟不是别人的日系车。。。看下面

5、控制台退出mysql,键入下面语句,并输入你的密码

sudo  nautilus
权限瞬间提升五个等级。。。以前只是神盾局小探员的等级,现在就是独眼局长的权限

然后再查看就ok了

PS:不过我发现我想直接把导出文件拖到桌面还是不行。。。只好打开另存到桌面。。。

不过最后删除的时候到时很顺手就删了。。。

你可能感兴趣的:(python)