相当一段时间没有写过博客了,一是最近学习Java进度确实不快,而且习惯在笔记本上面记些笔记了,今天突然想写篇博客是因为这一周在进行大数据实训嘛,学的是Pyth语言,有一说一,当你写惯Java规范的可能比较繁琐的代码后,让你去写Python,你会觉得一时间难以适应,莫名奇妙就声明了类型,画了大括号和分号,但是其简单的特性又不禁让你感叹Python的强大。下面记录一下今天简单爬虫一个网站,是自己接触爬虫第一次爬到自己想看到的数据。
工具
Python3.7,集成开发环境用的是Pycharm,Mysql版本是5.5.
爬虫
当今是数据时代,我们可以通过网络爬虫来获取到我们想要的信息、数据,而python是热门的网络爬虫的语言(主要是实训要求)
总体来说爬虫的步骤分为URL管理器,网页下载器,网页解析器。
网页下载器用到两个库 urlib 和 requests。
解析器:正则表达式(模糊匹配)、Html.parser、BeautifulSoup、LXML,另外一种是用Xpath解析,在网站上可找出对应Xpath地址,利用lxml下面的etree进行解析。
最后我们将爬取到的数据存储到数据库中,持久化存储。
完整代码
import bs4
import pymysql
import requests
from openpyxl import Workbook
from com.cdut.DAY05 import config
def pageDown(URL):
headers = {"user-agent" : "Google Chrome"} # 伪装成浏览器
response = requests.get(URL, headers=headers)
response.encoding = "gbk"
if response.status_code == 200:
return response.text
else:
print("服务器没有响应")
#bs解析网页
def pageParse(page):
# BeautifulSoup找的是节点
soup = bs4.BeautifulSoup(page, "lxml")
# 带有空格说明是父子从属关系
jobList = soup.select("#resultList .el") # 检索 id = resultList 下面 class = el 的子节点(id 是用 #号键)
# select 返回的永远是数组
JOB_List = []
# 对于item是每一行,即对每一个子节点我们仍要筛选出每一列对应的数据
for item in jobList[1:]:
jobName = item.select(".t1")[0].get_text(strip = True)
company = item.select(".t2")[0].get_text(strip = True)
city = item.select(".t3")[0].get_text(strip = True)
money = item.select(".t4")[0].get_text(strip = True)
time = item.select(".t5")[0].get_text(strip = True)
row = {
"jobName":jobName,
"company":company,
"city":city,
"money":money,
"time":time
}
JOB_List.append(row) # 大数组里面包含了每一行的字典
return JOB_List
# selector = etree.HTML(page)
# titleList1 = selector.xpath("//div/p/span/a/text()")
def createTable():
conn = pymysql.connect(**config)
cursor = conn.cursor()
cursor.execute("create table job (id int not null primary key, jobname varchar(50), company varchar(30), city char(8), salary varchar(12), time varchar(20))")
conn.commit()
def saveSql(list):
# with open("file\\title2.txt", mode="r", encoding="utf-8") as file:
conn = pymysql.connect(host="localhost", user="root", password="123456", database="chengdu", charset="utf8")
cursor = conn.cursor()
n = 1
for i in list:
cursor.execute("insert into job values ('%d', '%s', '%s', '%s', '%s', '%s')" % (n, i['jobName'], i['company'], i['city'], i['money'], i['time']))
n += 1
conn.commit()
cursor.close()
conn.close()
def saveExcel(jobList):
workbook = Workbook("大数据职位") #创建工作bu
sheet = workbook.create_sheet("北京Java", 0)
sheet.append(["职位名", "公司名", "地点", "薪资", "时间"])
for item in jobList:
sheet.append([item['jobName'], item['company'],item['city'],item['money'],item['time']])
workbook.save("job.xlsx")
if __name__ == '__main__':
page = pageDown("https://search.51job.com/list/010000,000000,0000,00,9,99,java,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=")
list = pageParse(page)
createTable()
saveSql(list)
saveExcel(list)