0x01文件构架和实现功能
需要采集数据
需要sqlite 存储数据
表格存储数据(这里用cvs格式比较简单)
发送压缩再发送邮件
会从51job网站上爬取招聘工作的信息,保存到cvs表格文件中,和数据库中,然后把表格中的数据压缩,通过邮箱发送给别人。
运行输出
0x02注意点
1.采集数据动态网站和静态网站是不同的,静态网站用可以接收到html,直接用xpath解析。动态网站是用js解析的 ,一般是拿到参数,用json.loads解析。动态网站的难点在于参数可能是加密过的。
这里是静态网站
2.判断静态和动态网站
右击查看元素,network,然后刷新网页会看到内容,随便选一条 control+f搜索网页中出现的文字,可以看到下面的东西
这个是静态网站
这东西是动态网站
可以看到静态的直接是html,动态的是json串。
3.cvs是一种比较简单的表格文件,直接在记事本里面编辑
1,2,3,4,5保存文件后缀名改为cvs用excile打开之后可以看到里面里面的数据会在每个表格的内容里(1,2,3之间的逗号是英文的)
-
发邮件163邮箱的设置
全部选钩,这时候会让输入授权密码代码中会用到 -
import zmail需要安装 pip install zmail 或者python -m pip install zmail
6.列表作为参数进行传参的时候需要注意一些问题,设置默认值的话会这个列表会在上一次操作之后保存的。参考
https://www.cnblogs.com/gpd-Amos/p/8998059.html
7.反爬
- 这里简单加了一个浏览器的头,模拟浏览器post
headers={
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0'
}
response=requests.get(url,headers=headers)
- 这里设置一个随机数,休眠随机时间
rand=randint(1,10)
time.sleep(rand/10)
0x04一些字符串处理姿势
这里的cols是一个列表 用join方法可以把列表拼接起来
sql1=sql1.rstrip(’,’) 字符串的rstrip(",")方法可以去除掉字符串右边尾部的字符
当然也有lstrip()
cols=[“title”, “address”,“salary”,""] 最后设置一个空字符串可以让最后一个元素后面也有想要加入的内容
cols=["title", "address","salary",""]
sql1=" varchar(255) ,".join(cols) 在每两个元素之间添加 varchar(255) ,拼接起来列表
sql1=sql1.rstrip(',')#去除两头的符号
print(sql1)
运行结果是
title varchar(255) ,address varchar(255) ,salary varchar(255)
代码
# -*- coding:utf-8 -*-
"""
1.采集工作数据
python php java html go
2. sqlite 存储数据
3. 表格存储数据
4. 采集完成以邮件 方式发送给工作人员
5. 将所有文件压缩再发邮件
6. 数据分析
每个分类的工作数量
工资区间
某个分类下每天的岗位数量
7. 图表展示
"""
"""
静态网站用xpath
动态网站用jison.loads
难点在于网址后面的参数加密
找工作网站:
智联招聘 前程无忧 拉勾网 Boss直聘
"""
import requests
from lxml import etree
import sqlite3
import re
import time
from random import randint
import zmail
import zipfile
def init_sqlite(cols,tb_name='job',db_name="job.db"):
con=sqlite3.connect(db_name)
cols1=cols
cols1.append("")
sql1 = " varchar(255) ,".join(cols)
sql1 = sql1.rstrip(',') # 去除两头的符号
sql1="""
CREATE TABLE IF NOT EXISTS %s(
id integer primary key autoincrement,
%s
)
"""%(tb_name,sql1)
# print(sql1)
con.execute(sql1)
return con
def get(url):
headers={
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0'
}
response=requests.get(url,headers=headers)
response.encoding=response.apparent_encoding
return response.content
#通过岗位名称搜工作 ,并存入数据库和表格
def search_job_py_name(name,con):
url="https://search.51job.com/list/010000%252C020000%252C030200%252C040000%252C180200,000000,0000,00,9,99,"+name+",2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare="
content=get(url)
root=etree.HTML(content)
total_page=root.xpath("//span[contains(text(),'页,到第')]/text()")[0]
total_page=total_page.replace("共","").replace("页,到第","")
print(total_page)
for page in range(1,int(total_page)+1):
page_url=url.replace(".html",str(page)+".html")
content = get(url)
root = etree.HTML(content)
job_list=root.xpath("//div[@id='resultList']/div[@class='el']")
for job in job_list:
rand=randint(1,10)
time.sleep(rand/10)
job_name=job.xpath("p/span/a/@title")[0]
job_href=job.xpath("p/span/a/@href")[0]
job_comany_name=job.xpath("span[1]/a/@title")
job_comany_name=job_comany_name[0] if job_comany_name else "没有公司名字"
job_place=job.xpath("span[2]/text()")
job_place=job_place[0] if job_place else "没有公司地点"
job_salary=job.xpath("span[3]/text()")
job_salary=job_salary[0] if job_salary else "面议"
# print(job_salary)
# pattern=re.compile("[-万/月千]")
# job_salary=pattern.split(job_salary)
job_date=job.xpath("span[4]/text()")
job_date=job_date[0] if job_date else "没有发布时间"
print(job_href,job_name,job_comany_name,job_salary,job_place,job_date)
data={
"job_href":job_href,
"job_name": job_name,
"job_comany_name": job_comany_name,
"job_salary": job_salary,
"job_place": job_place,
"job_date": job_date,
}
save_to_csv(data)
save_to_sqlite(con,data)
#存储到数据库,连接对象,插入的数据,表名 cols_value为字典
def save_to_sqlite(con,cols_value,tb_name="job",):
cols_name=",".join(cols_value.keys()) #取字典的key
col_values="'"+"','".join(cols_value.values())+"'"
sql1="""
INSERT INTO %s (%s) values (%s)
"""%(tb_name,cols_name,col_values)
# print(sql1)
con.execute(sql1)
con.commit()
#保存到表格csv文件
def save_to_csv(cols_value,csv_name="job.csv"):
"""
csv 文件特点:数据之间用逗号隔开
"""
values=cols_value.values()
values=",".join(values)
f=open(csv_name,'a',encoding="utf-8")
f.write(values+'\n')
f.close()
pass
#发邮件
def send_email(mail_name):
# mail_content = {
# 'subject': '重要通知', # 随便填写
# 'content_text': 'This message from zmail!', # 随便填写
# }
# 发送带附件的邮件
mail_content = {
'subject': 'Success!', # 邮件主题
# 邮件内容
'content_text': 'This message from zmail!',
# 如果失败,,'content': 'This message from zmail!',
'attachments': 'job.csv',
}
# 使用你的邮件账户名和密码登录服务器
server = zmail.server('要用来发送消息的邮箱号码', '这里填写授权密码')
# 发送邮件
server.send_mail(mail_name, mail_content)
#压缩文件
def zip_files():
#创建压缩包
azip=zipfile.ZipFile('工作信息.zip',"w")
#把文件添加进压缩包,加密方式是ZIP_LZMA
azip.write('./job.csv',compress_type=zipfile.ZIP_LZMA)
azip.close()
pass
if __name__ == '__main__':
con=init_sqlite(["job_href","job_name","job_comany_name","job_salary","job_place","job_date"])
search_job_py_name("python",con)
con.close()
send_email(“要发给谁(邮箱号码)")
zip_files()