一、打开需抓取的页面
网址URL
https://www.liepin.com/zhaopin/?ckid=542ae5fa5cb41481&fromSearchBtn=2°radeFlag=0&init=-1&key=PHP&headckid=542ae5fa5cb41481&d_pageSize=40&siTag=L-w5IwSlwjrBONoihH-bfA~fA9rXquZc5IkJpXC-Ycixw&d_headId=ba38c449642f2b4158b2683fc9f874c1&d_ckId=ba38c449642f2b4158b2683fc9f874c1&d_sfrom=search_unknown&d_curPage=0&curPage=1
右键检查元素
鼠标放在需检查的元素右键菜单-->
点击检查直接定位元素在网页中的位置
定位位置
右键-->xpath--->copy xpath
复制xpath路径
元素xpath路径://[@id="sojob"]/div[2]/div/div[1]/div[1]/ul/li[1]/div/div[1]/h3/a
老套路,先抓取一个元素能否成功
import requests
from lxml import etree
url = 'https://www.liepin.com/zhaopin/?ckid=542ae5fa5cb41481&fromSearchBtn=2°radeFlag=0&init=-1&key=PHP&headckid=542ae5fa5cb41481&d_pageSize=40&siTag=L-w5IwSlwjrBONoihH-bfA~fA9rXquZc5IkJpXC-Ycixw&d_headId=ba38c449642f2b4158b2683fc9f874c1&d_ckId=ba38c449642f2b4158b2683fc9f874c1&d_sfrom=search_unknown&d_curPage=0&curPage=1'
html = requests.get(url).text
select = etree.HTML(html)
title = select.xpath('//*[@id="sojob"]/div[2]/div/div[1]/div[1]/ul/li[1]/div/div[1]/h3/a/text()')[0]
print title
运行结果如下
超出索引范围
F12打开检查,再次copy xpath。还是不行,我首先想到的是,寒大教程里有的标签如果不删除打印不出来(第一个思想误区,这时候应该是打印空list),
寒大教程截图
这时候我开启了删除标签模式,删除/ul,/li,/div.结果都是超出索引范围。
我开始有些焦虑了,发挥不要脸的精神开始提问,结果是大佬没有明白我的问题,我呢也没有问出所以然来。这个问题在下一个问题解决的过程中解决了。
二、URL简化
上面看到,链接非常长,抓取单页倒无所谓,如果抓取多个页面。必须从链接中发现规律。
https://www.liepin.com/zhaopin/?ckid=542ae5fa5cb41481&fromSearchBtn=2°radeFlag=0&init=-1&key=PHP&headckid=542ae5fa5cb41481&d_pageSize=40&siTag=L-w5IwSlwjrBONoihH-bfA~fA9rXquZc5IkJpXC-Ycixw&d_headId=ba38c449642f2b4158b2683fc9f874c1&d_ckId=ba38c449642f2b4158b2683fc9f874c1&d_sfrom=search_unknown&d_curPage=0&curPage=1
发现链接中的?号后面的参数,记得寒大的教程里说到,GET数据传参,体现在URL里。链接和传递的参数用?连接。‘域名+?+参数1&参数2&参数3....。我就想着把多余的参数删除。当时做的有点绝所有的都删除了。然后再去分析xpath路径。突然发现了一个问题如下图
反爬虫
上图的一堆乱码。我绕过他。从下面子节点开始定位。新的xpath路径产生
//[@class="sojob-list"]/li[1]/div/div[1]/h3/a*
运行,不报错打印了出结果。
比较乌龙的是,打印的结果不是这一页,JAVA打印成了人力资源。
通过大佬@周斌的提醒说可能是URL加密,反爬虫。大佬给我推荐一个思路用urllib.urlencode(dict1)解析,
我兴致满满。打印天哪还是那个链接。经过了一天的各种无厘头的寻找答案。晚上才发现,这个链接根本就不是加密链接。然后通过两页的链接对比删除传参。保留查询关键词和当前页面参数。简化后的URL出炉
https://www.liepin.com/zhaopin/?key=PHP&curPage=1。更换链接,打印结果正确
结果
。
@周斌大佬给传授的经验挺有意思的,直接把字典转码成传参
import urllib
dict1 = {'a':'b', 'h':'l'}
raw = urllib.urlencode(dict1)
print raw
传参
今天,@周斌大佬把我真的刺激到了,他和我一样不是从事IT行业,他今天告诉我他40了,每天热情坚持学习编程和英语。我比他小那么多还有什么理由不努力,加油吧每一天。
这两天休班,开始偷懒了。房子里听听小说,收拾着房子。突然发现猎聘网的实战还没有完成。花了一个小时,完事
上完整代码:
# coding:utf-8
import requests
from lxml import etree
import xlwt
class LiepingData(object):
def __init__(self):
self.count = 1
self.f = xlwt.Workbook() # 创建工作薄
self.sheet1 = self.f.add_sheet(u'任务列表', cell_overwrite_ok=True) # 创建工作表
self.rowTitle = [u'编号', u'职位名', u'待遇', u'工作地点', u'学历', u'经验', u'公司名称', u'公司行业', u'职位描述']
for i in range(0, len(self.rowTitle)):
self.sheet1.write(0, i, self.rowTitle[i])
self.f.save('lieping.xlsx')
def getUrl(self):
for i in range(5):
url = 'https://www.liepin.com/zhaopin/?key=PHP&curPage={}'.format(i+1)
self.spiderPage(url)
def spiderPage(self, url):
if url is None:
return None
try:
proxies = {
'http': 'http://125.46.0.62:53281',
}
user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36'
headers = {'User_Agent': user_agent}
response = requests.get(url, headers=headers, proxies=proxies).text # 获取整个网页
select = etree.HTML(response)
trs = select.xpath('//*[@class="sojob-list"]/li')
for tr in trs:
data = []
title = tr.xpath('./div/div[1]/h3/a/text()') # 职位名
treatment = tr.xpath('./div/div[1]/p[1]/span[1]/text()') # 待遇
work = tr.xpath('./div/div[1]/p[1]/a/text()') # 工作地点
Education = tr.xpath('./div/div[1]/p[1]/span[2]/text()') # 学历
experience = tr.xpath('./div/div[1]/p[1]/span[3]/text()') # 经验
company = tr.xpath('./div/div[2]/p[1]/a/text()') # 公司名称
Industry = tr.xpath('./div/div[2]/p[2]/span/a/text()') # 公司行业
Description = tr.xpath('./div/div[1]/h3/a/@href') # 职位描述
title = title[0] if len(title) > 0 else ''
treatment = treatment[0] if len(treatment) > 0 else ''
work = work[0] if len(work) > 0 else ''
Education = Education[0] if len(Education) > 0 else ''
experience = experience[0] if len(experience) > 0 else ''
company = company[0] if len(company) > 0 else ''
Industry = Industry[0] if len(Industry) > 0 else ''
Description = Description[0] if len(Description) > 0 else ''
print title.strip(), treatment.strip(), work.strip(), Education.strip(), experience.strip(), company.strip()
print Industry.strip(), Description.strip()
if title.strip() and treatment.strip() and work.strip() and Education.strip() and experience.strip()and company.strip():
"""
拼成一个集合
"""
data.append(self.count) # 插入编号
data.append(title) # 插入职业名
data.append(treatment) # 插入待遇
data.append(work) # 插入工作地点
data.append(Education) # 插入学历
data.append(experience) # 插入经验
data.append(company) # 插入公司名
data.append(Industry) # 插入行业
data.append(Description) # 插入职业描述
self.count += 1 # 增加记录行数
for i in range(len(data)):
self.sheet1.write(data[0], i, data[i])
self.f.save('lieping.xlsx')
except Exception, e:
print '出错', e.message
if '_main_':
job = LiepingData()
job.getUrl()
抓取效果
总结
现在还说不好已经掌握xpath,唯有多练多想多学。全局变量和三目运算还是不太懂,你不加就不行,strip()还是加油吧。加油2018年5月11日。










网友评论