晚上好🌙🌙🌙
本答案参考ChatGPT-3.5
根据报错信息 ConnectionError: HTTPConnectionPool(host='water.36hjob.com', port=80): Max retries exceeded with url: /job-GxKVe.html (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 11001] getaddrinfo failed',))
可以看出出现了一个连接错误,那么是什么引起了连接错误呢?
首先这个错误是由 requests.get
方法引起的,由前面的代码可以看出 requests.get
请求了两个页面,第一个是搜索页面,第二个是搜索结果页面对应详情页面。而在请求详细页面时出现了连接错误。
出现连接错误有很多原因,包括:
1.目标主机不可达或者服务不可用;
2.有些网站在检测到非浏览器的请求时会禁止访问并且返回错误。
所以我们可以进行以下操作来解决:
1.检查目标网站是否正常运行,或者在请求过程中发生了什么。
2.检查 User-Agent
是否包含正确的浏览器信息,如果不包含,则可能会被网站认为是非法请求。
3.考虑增加延时时间,避免短时间内请求过于频繁。
修改上述代码需要增加异常处理以便调试:
# 获取数据列表
def get_data_list(url, headers):
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"Failed to fetch page {url}: {str(e)}")
return None
don = etree.HTML(response.text)
data_list = list()
href_list = don.xpath('//*[@id="tblmain"]/tr/td[1]/a/@href')
for href in href_list:
rq = requests.get(href, headers=headers)
try:
rq.raise_for_status()
don1 = etree.HTML(rq.text)
e = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[1]/td[1]/text()')
h = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[2]/td[1]/text()')
g = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[2]/td[2]/text()')
b = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[4]/td[1]/text()')
t = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[6]/td[2]/text()')
m = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[7]/td[2]/text()')
n = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[4]/td[2]/text()')
w = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[3]/td[1]')
data = {
'工作性质': e[0] if e else '',
'专业要求': h[0] if h else '',
'学历要求': g[0] if g else '',
'年龄要求': b[0] if b else '',
'外语要求': t[0] if t else '',
'职称要求': w[0] if w else '',
'招聘人数': m[0] if m else '',
'经验要求': n[0] if n else '',
}
data_list.append(data)
time.sleep(random.randint(10, 30))
except requests.exceptions.RequestException as e:
print(f"Failed to fetch page {href}: {str(e)}")
return data_list
# 获取数据
def get_data(key, page, headers):
url = f'http://www.36hjob.com/Job/Search?matchfield=1&soword={key}&Page={page}'
print(url)
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"Failed to fetch page {url}: {str(e)}")
return None
don = etree.HTML(response.text)
jobnames = don.xpath('//*[@id="tblmain"]/tr/td[1]/a/text()')
salary = don.xpath('//*[@id="tblmain"]/tr/td[4]/text()')
place = don.xpath('//*[@id="tblmain"]/tr/td[3]/text()')
place_1 = [i.replace('', 'none') for i in place]
company_name = don.xpath('//*[@id="tblmain"]/tr/td[2]/a/text()')
date = don.xpath('//*[@id="tblmain"]/tr/td[5]/text()')
data_list = get_data_list(url, headers)
data = pd.DataFrame({
'职位名称': jobnames,
'招聘日期': date,
'月薪': salary,
'工作地点': place_1,
'公司名称': company_name
})
if data_list:
data = pd.concat([data, pd.DataFrame(data_list)], axis=1)
return data
接下来将 main
方法调整为循环的 get_data
方法即可:
keys = ['C++', '大数据', 'hive', 'java', 'hadoop', 'web', 'SQL', '计算机网络', '区块链', '数据分析', '文员', '媒体', '摄影', '化妆师']
df = pd.DataFrame()
headers = {'User-Agent': generate_random_user_agent()}
for key in keys:
for page in range(1, 40):
data = get_data(key, page, headers)
if data is not None:
df = df.append(data, ignore_index=True)
time.sleep(random.randint(10, 30))