|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 kerwin_lui 于 2018-5-18 17:57 编辑
背景介绍:
本人参加了今年的公务员考试,近日突然想把今年 “中公教育” 网上的 “浙江省的公务员面试成绩” 爬取下来。
经过网页踩点,发现都是以excel文件的形式存在网页上,遂根据 《零基础入门python》 这本书的内容开始我人生中的第一个爬虫~~
目的:下载网站上近两百个excel文件
代码如下:
- import requests
- import urllib
- import re
- from lxml import etree
- headers = {}
- headers['User-Agent'] ='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36'
- headers['Referer'] = 'http://zj.offcn.com/zg/skzcj/'
- #获取响应的文本,并做好编码修正
- def getHTMLtext(url):
- try:
- r = requests.get(url,timeout = 20, headers = headers)
- r.raise_for_status()
- r.encoding = r.apparent_encoding
- return r.text
- except:
- return "产生异常"
- #匹配xpath语句,得到url
- def matchXpathURL(html_text,condition_xpath): #传入html的文本和xpath语句的条件,匹配出对应的url
- obj_xpath = etree.HTML(html_text) #生成xpath解析对象
- match_url = obj_xpath.xpath(condition_xpath)
- return match_url
- #匹配re语句,得到url的list形式
- def matchReURL(html_text,condition_re):
- match_url = re.findall(condition_re,html_text)
- return match_url
- #定义一个下载器,简化代码
- def download(url,file_path):
- content = requests.get(url).content #二进制数据
-
- with open(file_path,"wb") as f :
- f.write(content)
-
-
- if __name__ == "__main__":
- pri_url = "http://zj.offcn.com/zg/skzcj/"
- pri_url_html = getHTMLtext(pri_url) #起始爬虫网页的html文本(已修正编码)
- condition_city = "//div[@class='xc'][1]//li[position()>1]/a/@href" #城市的xpath筛选条件
- city_url = matchXpathURL(pri_url_html,condition_city) #筛选,得到所有城市的url
-
- ii = 1 # 初始化:目标文件序号
-
- #用循环,找到每个城市的每个部门的url,并找到xls文件,下载
- for each in city_url:
- print("城市的网页地址 : ",each,"\n\n") #打印每一个城市的url
- city_url_html = getHTMLtext(each) #得到所有城市的html文本
- condition_department = r'<p><a href="(http://zj.offcn.com/html.*?\.html)".*?2018浙江公务员考试总成绩及体检名单' #部门的re筛选条件
- department_url = matchReURL(city_url_html,condition_department) #筛选,得到所有部门的url
-
-
- #获取到每个部门的url,继续用循环获得每个部门的html页面,再筛选到xls文件所在位置
- for i,e in enumerate(department_url):
- print("部门的网页地址 : ",e) #打印每一个部门的url
- department_html = getHTMLtext(e)
- condition_xls = r'<a href="(http:.*?\.(?:xls|doc|pdf|xlsx|docx))"'
- target_xls_url = matchReURL(department_html,condition_xls) #获取到每个部门的成绩文件,供后续下载-----list形式--["www....."]
- print("目标文件的下载地址 : ",target_xls_url) #打印目标文件的url,检测目标文件的url是否获取正常
-
-
-
- #用for循环,将list形式转化为字符串——(把[]去掉)
- for target_xls_url_real in target_xls_url:
-
-
- #确定文件的后缀名,确保文件存储为正确的格式!
- suffix_condition = r'([a-z]+)
- suffix_name = matchReURL(target_xls_url_real,suffix_condition) #得到后缀名的list格式,等待去帽~~
- #去帽:
- for suffix_name_real in suffix_name :
- file_name = r"\%d.%s" % (ii,suffix_name_real) #确定每个目标文件的命名
- ii += 1
- file_path = r"C:\Users\kerwin\Desktop\spider\ZG_excel" + file_name #确定文件下载的路径
- print("文件保存路径 : ",file_path)
- download(target_xls_url_real,file_path)
- print("成功下载了一个文件 !!\n\n")
-
-
- print("全部文件下载完成 !!\n") #提示结束
复制代码
今天刚刚写完,发现有很多很多问题!!
特别是for循环重复写了好几个,但并没有真正起到循环的作用,仅仅是想把 ["i love fishc.com" , "i love fishc.com"] 外边的 [] 的帽子给摘掉,变成单纯的字符串~~
不知道除了for循环 还要怎么实现??
初学者无知,若犯了低级错误,不要见怪~~~
也希望鱼C的大牛们,能给初学者提些改进的建议,不管是代码逻辑上、注释上、变量命名上、正则匹配上.......... 的问题,万分感谢了!!!!
- tmp = ["i love fishc.com" , "i love fishc.com"]
- print(','.join(tmp))
复制代码
|
|