您的位置:首页 > 编程语言 > Python开发

一个人才数据网的爬虫软件

2017-06-09 18:21 211 查看
最近表哥让我帮他写个软件,定时爬取一个人才数据网站的信息,思路和方法很简单,不过过程中遇到的坑真的不少,今天对整个软件的开发过程做个记录。

网站是 余姚人才网,链接就不上了,百度第一个就是。

还是老样子,python+request+beautifulsoup4 三把斧,这个是整个软件的核心,

先写一个请求网页的函数

def get(url):
try:
response = requests.get(url)
return response.text
except EOFError:
raise 'error'


用到了request库,利用request.get() 方法向网站请求,然后return 网站的文本信息,如果请求不成功则抛出异常。

然后写一个解析网页的结构的函数,利用的是beautifulsoup库,注意导入库的时候要从 bs4 中导入,如
from bs4 import BeautifulSoup


def makesoup(response):
listt=[]
soup = BeautifulSoup(response,'lxml')
soup = soup.find_all(attrs='li',class_='seaList13')
for i in soup:
listt.append(i.text)
return listt


先用Beautifulsoup(),将请求解析,用的是lxml解析器,这个解析器也需要安装,用命令

pip install lxml 。 如此一锅‘美味汤’就煲出来了,然后去分析一下网站的html源码,发现我们要爬去的内容的标签都是这样的

宁波永强不锈钢制品有限公司

所以我们要解析的标签名是 li ,类名是 seaList13 ,所以我们可以这样寻找我们要的内容,

soup = soup.find_all(attrs='li',class_='seaList13')


找出所有标签名为li , class名为 sealist13 的标签,注意这里要用 class_ ,不然会和Python关键字冲突。

接下来的代码就设计到了具体的需求,这里就不细讲了,但是有几个要注意的地方要提一下。

爬去的数据我要保存在一个txt文件中,因此设计到了文件的打开,一开始我用的是 open() 这个Python自带的方法,打开方式为 a+ (以可读可写的方式打开,如不存在则创建,读取时从第一行开始读取,从最后一行开始增加),编码格式为utf-8,但是发现这个方法并不好用,大概是因为从网站上爬取的内容是utf-8编码的,但是信息在python内部中交流的时候又是Unicode编码的,需要不停地进行encode和decode,相当的麻烦并且不易开发。

不过题主发现有个库特别好用,codecs,是标准库中的,用codecs.open()打开文件不用转码,模块会自动的解编码(大概??)

比如要以utf8 的方式打开一个txt,并逐行加入一个列表中

txt = codecs.open(r'mulu.txt', 'r', 'utf-8')
yi_cun_zai = [k.strip() for k in txt]


这里我为了图省事用的 是 a+的方式打开文件,但是后来发现怎么也读取不进列表,改了半天bug都没找到问题,后来改成了 r 终于可以写进列表了,但是不知道原因,要是有大佬知道还请指点下。

下面还有一个难点是gui的制作,毕竟是要做个别人看的,老在dos下看肯定不方便。

def on_go():
root = Tk()
t = Text(root)
t.pack()
for i in range(1):
xian_shi_wo  =   get_yao_xian_shi_de_(i)
for j in xian_shi_wo:
winsound.Beep(500, 500)
t.insert(INSERT, j+'         ')
t.insert(INSERT, str(time.ctime())+'\n\r')
t.mark_set('insert', 1.0)
t.update()
time.sleep(0.1)
t.mainloop()
```
用的是tkinter,思路大概是先创建一个根目录框,root=Tk(),然后接下来的每个组件都是在这个root下创建,t=Text(root),这个表示的是在root下创建一个text的组件,然后将t摆放好,t.pack(),在一切都设置好了以后将控件循环 , t.mainloop(),对了有个声音的空间挺有意思的


import winsound

winsoud.Beep(500,500)

表示发出500(0~1000)大小的,持续时间500ms的蜂鸣声。

到此为止整个程序的编写过程就结束了(还有些细节我没写,不代表没有)
整个代码如下


--coding:utf-8--

from bs4 import BeautifulSoup

import requests,codecs,urllib,sys

import codecs

from tkinter import *

import time , datetime, winsound,queue

def get(url):

try:

response = requests.get(url)

return response.text

except EOFError:

raise ‘error’

def makesoup(response):

listt=[]

soup = BeautifulSoup(response,’lxml’)

soup = soup.find_all(attrs=’li’,class_=’seaList13’)

for i in soup:

listt.append(i.text)

return listt

def get_yao_xian_shi_de_(i):

yi_cun_zai=[]

yao_xian_shi_de_ = []

txt = codecs.open(r'mulu.txt', 'r', 'utf-8')

yi_cun_zai = [k.strip() for k in txt]

txt.close()
txt = codecs.open(r'mulu.txt', 'a+', 'utf-8')

url = 'http://www.yyrc.com/job/?JobType=0&WorkPlace=0&Trade' \
'=0&Property=0&JobProperty=0&Degree=0&WorkYears=0&Sex=0&MonthPay=0&' \
'PublishDate=0&Key='+'%CD%E2%C3%B3'+'&Orderid=0&Styleid=2&PageNo='+str(i)
response = get(url)
list_1 = makesoup(response)
list_1 = list(set(list_1))

for j in list_1:
if j in yi_cun_zai:
continue
else:
#print(j)
yao_xian_shi_de_.append(j)
txt.write(j+'\r\n')

txt.close()
return yao_xian_shi_de_


def on_go():

root = Tk()

t = Text(root)

t.pack()

for i in range(1):

xian_shi_wo = get_yao_xian_shi_de_(i)

for j in xian_shi_wo:

winsound.Beep(500, 500)

t.insert(INSERT, j+’ ‘)

t.insert(INSERT, str(time.ctime())+’\n\r’)

t.mark_set(‘insert’, 1.0)

t.update()

time.sleep(0.1)

t.mainloop()

if name == ‘main‘:

while True:
on_go()


“`

但是还有一步没做完,打包成exe文件,这个也折腾了我好久

我用的是pyinstaller,也是一个库,可以直接pip install pyinstaller

然后
4000
进入到python35/script 文件夹中,进入commend模式,执行语句:

python pyinstaller.exe 你要打包的文件地址

还有一些控制语句 -F表示 将所有东西都打包成一个.exe 文件,-w表示不显示dos框。

如我要打包的程序是yuyao.py

我的语句就是 python pyinstaller.exe -F -w yuyao.py

这样一个exe文件就生成了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 爬虫