最近表哥让我帮他写个软件,定时爬取一个人才数据网站的信息,思路和方法很简单,不过过程中遇到的坑真的不少,今天对整个软件的开发过程做个记录。
网站是 余姚人才网,链接就不上了,百度第一个就是。
还是老样子,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,queuedef 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 listtdef 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
然后进入到python35/script 文件夹中,进入commend模式,执行语句:
python pyinstaller.exe 你要打包的文件地址
还有一些控制语句 -F表示 将所有东西都打包成一个.exe 文件,-w表示不显示dos框。
如我要打包的程序是yuyao.py
我的语句就是 python pyinstaller.exe -F -w yuyao.py
这样一个exe文件就生成了